创建类的执行流程:

  • 遇到class关键词,执行type的__init__方法,创建Foo类这个对象
  • 遇实例化对象(obj=Foo()),执行type里的__call__方法
  1. 在call方法里调用Foo类的__new__方法(负责创建对象)
  2. 执行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())

 

posted on 2019-04-29 09:33  chester·chen  阅读(154)  评论(0编辑  收藏  举报