2019独角兽企业重金招聘Python工程师标准>>>
metaclass--元类
除了使用type()动态创建类以外,要控制类的创建行为,还可以使用metaclass。 metaclass,直译为元类,简单的解释就是:
当我们定义了类以后,就可以根据这个类创建出实例,所以:先定义类,然后创建实例。
但是如果我们想创建出类呢?那就必须根据metaclass创建出类,所以:先定义metaclass,然后创建类。
连接起来就是:先定义metaclass,就可以创建类,最后创建实例。
所以,metaclass允许你创建类或者修改类。换句话说,你可以把类看成是metaclass创建出>来的“实例”。
元类特性
一、下面代码展示了元类可以创建类.以及元类的常用写法:
class Hello:passclass 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):passclass User(World):def say(self):passprint("-" * 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'>
"""