1. 程式人生 > >關於six.with_metaclass(ABCMeta, object)的理解

關於six.with_metaclass(ABCMeta, object)的理解

過程 ant plan live 中一 AR HA strac 函數

在學習Python過程中,看到了生成虛基類的方式,
class PeopleBase(six.with_metaclass(ABCMeta, object)):
    @abstractmethod
    def work(self, *args, **kwargs):
        #pass為空語句,占位用
        pass

    @abstractmethod
    def live(self, *args, **kwargs):
        pass
對於six.with_metaclass(ABCMeta, object)不太理解,找了些資料,其中一篇博文對元類講解的比較詳細,鏈接如下: Python中的元類(譯):https://www.cnblogs.com/ajianbeyourself/p/4052084.html 上面的博文比較長,僅就six.with_metaclass(ABCMeta, object)相關的內容,做一點筆記 元類就是創建類的類,在Python中,只有type類及其子類才可以當元類, type創建類時,參數格式:type(classname, parentclasses , attrs),classname是類名,字符串類型,parentclasses是類的所有父類,元組類型,attrs是類的所有{屬性:值},是字典類型 一切類的創建最終都會調用type.__new__(cls, classname, bases, attrs),它會在堆中創建一個類對象,並返回該對象 當通過type.__new__(cls, classname, bases, attrs)創建類時,cls就是該類的元類,它是type類或其子類。 ABCMeta是一個抽象類的元類,用來創建抽象類基類:Metaclass for defining Abstract Base Classes (ABCs). six.with_metaclass是用元類來創建類的方法,調用一個內部類,在內部類的__new__函數中,返回一個新創建的臨時類
def
with_metaclass(meta, *bases): """Create a base class with a metaclass.""" # This requires a bit of explanation: the basic idea is to make a dummy # metaclass for one level of class instantiation that replaces itself with # the actual metaclass. class metaclass(type): def
__new__(cls, name, this_bases, d): return meta(name, bases, d) @classmethod def __prepare__(cls, name, this_bases): return meta.__prepare__(name, bases) return type.__new__(metaclass, temporary_class, (), {})
six.with_metaclass(ABCMeta, object)就通過內部類的__new__函數返回一個ABCMeta元類創建的臨時類,
作為PeopleBase類的基類 在python裏類也是對象,下面兩個語句可以看PeopleBase類的類型,都是<class ‘abc.ABCMeta‘>,即PeopleBase類是ABCMeta元類的對象,是由ABCMeta元類生成的。
print(type(PeopleBase))
print(PeopleBase.__class__)
#<class ‘abc.ABCMeta‘>
#<class ‘abc.ABCMeta‘>

關於six.with_metaclass(ABCMeta, object)的理解