#1、メタクラスで、カスタムクラスのデータ属性を大文字の クラスMymetaclass(type)に変更するための制御: def __new__ (cls、name、bases、attrs): update_attrs = () for k、v in attrs.items( ): 呼び出し可能でない場合 (v)および k.startswith(' __ ' )でない場合: update_attrs [k.upper()] = v else : update_attrs [k] = v 戻り値の型__new__ (cls、name、bases、update_attrs)クラス 中国(メタクラス= Mymetaclass): 国 = ' 中国' タグ = ' 竜の伝説' DEF (自己を)歩く: 印刷(' %sが歩行である'%のself.name) プリント(。中国__dict__ ) '' ' {' __module__ ':' __main__ '、 ' COUNTRY ':' China '、 ' TAG ':' Legend of the Dragon '、 ' walk ':<function Chinese.walk at 0x0000000001E7B950>、 ' __dict__ ':<attribute' __dict__ 'of'中国語のオブジェクト>、 '__weakref__':<'Chinese'オブジェクトの属性 '__weakref __' >、'__ doc__ ':なし} '' '
#2. __init__メソッドなしでメタクラス内のカスタムクラスを制御する #2.1。メタクラスはオブジェクトの作成と操作の初期化に役立ちます; #2.2。インスタンス化中に渡されるパラメーターはキーワードの形式である必要があります。例外TypeError例外:キーワード引数を使用しなければならない #の2.3.keyのカスタムクラスのオブジェクトは、ユーザの属性として生成され、属性すべて大文字で書かれ たクラス:Mymetaclass(タイプ) #:DEF __new __(CLS、名前、塩基、attrsに) # {update_attrs = } # でKは、Vのattrs.items(): # もしそうでないと呼び出し可能(V)およびNot k.startswith( '__'): #1 update_attrs [k.upper()] = Vの # 他: #1 update_attrs [K] = v # 戻り値の型.__ new __(cls、name、bases、update_attrs) def __call__(self、* args、** kwargs): if args: raise TypeError(' must use keyword argument for key function ' ) obj = object。__new__(self) #创建対象、self是类Foo for k、v in kwargs.items(): obj。__dict__ [k.upper()] = v return obj class Chinese(metaclass = Mymetaclass): country = ' China ' tag = ' Legend of the Dragon ' #ドラゴン DEF ウォーク(セルフ): 印刷(' %Sは、歩いている'%self.name) P =中国(名前= ' リリ'、18ある=年齢、性別= ' MALE ' ) を印刷(P. __dict__)
#3、オブジェクトのメタクラスのコントロールクラスのカスタムは、生産関連のプロパティは、すべての隠された属性のある クラスMymeta(タイプの): DEF __init__ (セルフは、CLASS_NAME、class_bases、class_dic): #Controlクラスがfooの作成 スーパー(Mymeta、セルフ)__init__ (CLASS_NAME、class_bases、class_dic) DEF __call__(自己、引数*、** kwargsから): #制御プロシージャ・コールはFoo、すなわちFooの生成処理対象 。OBJ =自己__new__ある(自己) 。自己__init__(OBJ 、* argsを、** kwargsから) OBJ。__dict__ = { ' _ __ S%S%'%(セルフ。__name__、K):V以下のためのK、V で OBJ。__dict__ .items()} を返すOBJ クラスはFoo(オブジェクト、メタクラス= Mymeta): #はFoo = Mymeta(...) デフ __init__ (自己、名前、年齢、性別): self.name = 名前 self.age = 年齢の 自己.sex = 性別 OBJ =フー(' リリ'、18 ' 男性' ) プリント(OBJ。__dict__)
4.メタクラスに基づくシングルトンモード:古いウェットリンクhttps://zhuanlan.zhihu.com/p/109336845