下面是一段python基于类创建对象的代码
- class Foo(object):
- def __init__(self, name):
- self.name = name;
-
- obj=Foo('LYJ')
基于这个类创建对象一般会分为两部走:
1. 程序自动帮你调用new方法、创建对象(空对象)-----构造方法
2. 程序接着执行类中的init方法,初始化该空对象 -----初始化方法
所以:对象是基于类创建出来的
那么类是由谁创建的呢?先说结论:
类默认是由type创建的
为什么这么说呢,下面看两段代码:
在我们日常写代码的过程中,传统创建方式是:
- class Foo(object):
- val = 1
- def func(self):
- return "Hello World!"
除了这种,其实还有一种不常见的创建方法:
Foo = type('Foo', (object),{'val':1,"func":lambda self:888})
上面这两种创建方法其实都是由type创建,只不过第一种更为直观而已;
类默认是由type创建的,那该怎么让一个类的创建改成由别的东西来创建呢?此时就有了元类
- class MyType(type):
- pass
-
- class Foo(object, metaclass=MyType):
- pass
此时Foo就是由mytype创建的类,那么当Foo被创建的时候,就会调用mytype里面的方法(类似于mytype类创建出了一个Foo对象)
将这段代码再详细展开和剖析一下:
- class MyType(type):
- def __new__(cls, *args, **kwargs):
- # 为当前的Foo创建了一个空类
- new_cls = super().__new__(cls, *args, **kwargs)
- return new_cls
-
- def __init__(cls, *args, **kwargs):
- # 初始化该类
- super().__init__(cls, *args, **kwargs)
-
- def __call__(self, *args, **kwargs):
- # 调用本类的__new__方法去创建对象
- empty_obj = self.__new__(self)
- # 调用本类中的__init__方法初始化Foo类
- self.__init__(empty_obj, *args, **kwargs)
-
- return empty_obj
-
-
- class Foo(object, metaclass=MyType):
- def __init__(self, name):
- self.name = name
- def __call__(self, *args, **kwargs):
- print('foo_call')
-
- # 类的实例化
- # Foo()会优先执行mytype中的call方法
- v = Foo('lyj')
-
- # 此时会执行Foo的call方法
- v()
这里的__call__方法和python面向对象里面的__call__方法相同,具体可以参看我的另一篇文章:
下面我们再捋一边上面这个代码: