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


在學習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)不太理解,找了些資料,其中一篇博文對元類講解的比較詳細,鏈接如下:
 
上面的博文比較長,僅就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'>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM