メタクラスアプリケーションの例(エゴンオールドウェットから処理)

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

 

おすすめ

転載: www.cnblogs.com/caoyu080202201/p/12710014.html