metaclass--元類

metaclass--元類

除了使用type()動態建立類之外,要控制類的建立行爲,還能夠使用metaclass。 metaclass,直譯爲元類,簡單的解釋就是:python

當咱們定義了類之後,就能夠根據這個類建立出實例,因此:先定義類,而後建立實例。code

可是若是咱們想建立出類呢?那就必須根據metaclass建立出類,因此:先定義metaclass,而後建立類。io

鏈接起來就是:先定義metaclass,就能夠建立類,最後建立實例。function

因此,metaclass容許你建立類或者修改類。換句話說,你能夠把類當作是metaclass建立出>來的「實例」。class

元類特性

1、下面代碼展現了元類能夠建立類.以及元類的經常使用寫法:

class Hello:
    pass


class Base(type):
    def __new__(cls, name, bases, attrs):
        print(f"cls:{cls}")
        print(f"name:{name},type:{type(name)}")
        print(f"bases:{bases},type:{type(bases)}")
        print(f"attrs:{attrs},type:{type(attrs)}")
        print("=" * 50)
        return type.__new__(cls, name, bases, attrs)


class World(metaclass=Base):
    pass


class User(World):
    def say(self):
        pass


print("-" * 50)
print(f"Hello-type:{type(Hello)}")
print(f"World-type:{type(World)}")

"""
cls:<class '__main__.Base'>
name:World,type:<class 'str'>
bases:(),type:<class 'tuple'>
attrs:{'__module__': '__main__', '__qualname__': 'World'},type:<class 'dict'>
==================================================
cls:<class '__main__.Base'>
name:User,type:<class 'str'>
bases:(<class '__main__.World'>,),type:<class 'tuple'>
attrs:{'__module__': '__main__', '__qualname__': 'User', 'say': <function User.say at 0x1091d4378>},type:<class 'dict'>
==================================================
--------------------------------------------------
Hello-type:<class 'type'>
World-type:<class '__main__.Base'>
"""
相關文章
相關標籤/搜索