注:這是我整理的一些學習筆記,大部分是別人的文章,也加了一些個人理解。使用的是python3.5
參考這些博客:http://blog.jobbole.com/21351/http://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python__new__和__init__參考這里:點擊打開鏈接使用type()生成類:type(類名,父類的元組(針對繼承的情況,可以為空),包含屬性的字典(名稱和值))Foo = type('Foo', (), {'bar': True})# 也可以MyClass = type('Foo', (), {'bar': True})'''等價于:class Foo(object): bar = True'''def func(): print('I add a method now...')Deriv = type('Deriv', (Foo,), {'func': func})print(hasattr(Foo, 'func'))print(hasattr(Deriv, 'func'))'''FalseTrue'''print(Deri.__class__)'''<class 'type'>'''class Foo(object): passprint(Foo.__class__)print(Foo.__class__.__class__)'''<class 'type'><class 'type'>'''class Foo(object): passFoo中有__metaclass__這個屬性嗎?如果是,Python會在內存中通過__metaclass__創建一個名字為Foo的類對象(我說的是類對象,請緊跟我的思路)。如果Python沒有找到__metaclass__,它會繼續在Bar(父類)中尋找__metaclass__屬性,并嘗試做和前面同樣的操作。如果Python在任何父類中都找不到__metaclass__,它就會在模塊層次中去尋找__metaclass__,并嘗試做同樣的操作。如果還是找不到__metaclass__,Python就會用內置的type來創建這個類對象。# 請記住,'type'實際上是一個類,就像'str'和'int'一樣# 所以,你可以從type繼承class UpperAttrMetaClass(type):    # __new__ 是在__init__之前被調用的特殊方法    # __new__是用來創建對象并返回之的方法    # 而__init__只是用來將傳入的參數初始化給對象    # 你很少用到__new__,除非你希望能夠控制對象的創建    # 這里,創建的對象是類,我們希望能夠自定義它,所以我們這里改寫__new__    # 如果你希望的話,你也可以在__init__中做些事情    # 還有一些高級的用法會涉及到改寫__call__特殊方法,但是我們這里不用    def __new__(upperattr_metaclass, future_class_name, future_class_parents, future_class_attr):        attrs = ((name, value) for name, value in future_class_attr.items() if not name.startswith('__'))        uppercase_attr = dict((name.upper(), value) for name, value in attrs)        return type(future_class_name, future_class_parents, uppercase_attr)class UpperAttrMetaclass(type):    def __new__(upperattr_metaclass, future_class_name, future_class_parents, future_class_attr):        attrs = ((name, value) for name, value in future_class_attr.items() if not name.startswith('__'))        uppercase_attr = dict((name.upper(), value) for name, value in attrs)        # 復用type.__new__方法        # 這就是基本的OOP編程,沒什么魔法        return type.__new__(upperattr_metaclass, future_class_name, future_class_parents, uppercase_attr)'''你可能已經注意到了有個額外的參數upperattr_metaclass,這并沒有什么特別的。類方法的第一個參數總是表示當前的實例,就像在普通的類方法中的self參數一樣。當然了,為了清晰起見,這里的名字我起的比較長。但是就像self一樣,所有的參數都有它們的傳統名稱。因此,在真實的產品代碼中一個元類應該是像這樣的:'''class UpperAttrMetaclass(type):    def __new__(cls, name, bases, dct):        attrs = ((name, value) for name, value in dct.items() if not name.startswith('__'))        uppercase_attr = dict((name.upper(), value) for name, value in attrs)        return type.__new__(cls, name, bases, uppercase_attr)'''為防止出現基類重復構造,使用__super__'''class UpperAttrMetaclass(type):    def __new__(cls, name, bases, dct):        attrs = ((name, value) for name, value in dct.items() if not name.startswith('__'))        uppercase_attr = dict((name.upper(), value) for name, value in attrs)        return super(UpperAttrMetaClass, cls).__new__(cls, name, base, uppercase_attr)ss
新聞熱點
疑難解答