元类是python比较高级的用法,简而言之,元类就是创建类的类。
而type就是一个元类,是用来创建类对象的类。
因此,要定义元类就要使其继承type类。
通常情况下,开发者在使用OOP的方式编程时,往往会用到__init__方法,即构造函数。该方法会在类初始化时运行。但是我们可以将验证的时机提前,以至于提前到类创建之时,因此就会用到__new__方法。
class Base(type):
def __new__(cls, name, param, dicts):
print(cls)
print(name)
print(param)
print(dicts)
return super().__new__(cls, name, param, dicts)
class Meta(metaclass=Base):
name = 'yang'
def person(self):
pass
Meta()
<class '__main__.Base'>
Meta
()
{'__module__': '__main__', '__qualname__': 'Meta', 'name': 'yang', 'person': <function Meta.person at 0x10c6492f0>}
注意,元类中所编写的验证逻辑,针对的是该基类的子类,而不是基类本身。
__new__()
方法接收到的参数依次是:
-
当前准备创建的类的对象;
-
类的名字;
-
类继承的父类集合;
-
类的方法集合。
class Base(type):
def __new__(cls, name, bases, attrs):
# print(cls)
print(name)
print(bases)
print(attrs)
return super().__new__(cls, name, bases, attrs)
class People:
pass
class Meta(People, metaclass=Base):
name = 'yang'
def person(self):
return self.name
Meta()
Meta
(<class '__main__.People'>,)
{'__module__': '__main__', '__qualname__': 'Meta', 'name': 'yang', 'person': <function Meta.person at 0x7f0cf38bd840>}