创建类的执行流程:
- 遇到class关键词,执行type的__init__方法,创建Foo类这个对象
- 遇实例化对象(obj=Foo()),执行type里的__call__方法
- 在call方法里调用Foo类的__new__方法(负责创建对象)
- 执行Foo类的__init__方法(初始化)
class MyType(type): def __call__(cls,*args,**kwargs): obj = cls.__new__(cls,*args,**kwargs) print('在这里面..') print('==========================') print('来咬我呀') obj.__init__(*args,**kwargs) return obj class Foo(metaclass=MyType): def __init__(self): self.name = 'alex' f = Foo() print(f.name)
在Python中一切皆为对象,class(类)作为模板同样也是对象。
我们可以通过type在运行期间动态创建类,同样我们也可以通过metaclass(元类)来控制类的创建过程。
简言之,我们可以先定义metaclass,然后使用它来创建(或者修改)class,这个class可以看成metaclass的实例,有点绕。
下面我们使用metaclass来为我们自定义的MyString添加一个len方法:
class StringMetaclass(type): def __new__(cls, name, bases, attrs): attrs['len'] = lambda self: self.__len__() return type.__new__(cls, name, bases, attrs) class MyString(str, metaclass=StringMetaclass): pass if __name__ == '__main__': mystr = MyString("123") print(mystr.len())