元类
一、概述
python最重要的哲学概念是一切皆对象。我们知道产生实例对象的是类对象,那类对象又是由谁来产生的呢?类对象就是由元类对象产生的,python3中元类方法就是type
type类需要传入三个参数:类名,继承的类的元祖列表,类的方法字典
1、常用产生类的方法
class Foo:
def __init__(self,name):
self.name = name
f1 = Foo('hyj')
print("类:%s,实例:%s,实例字典:%s"%(Foo,f1,f1.__dict__))
###
类:<class '__main__.Foo'>,实例:<__main__.Foo object at 0x1038ad0f0>,实例字典:{'name': 'hyj'}
2、使用type方法来产生一个类
def __init__(self,name):
self.name = name
Foo = type('Foo',(),{'__init__':__init__})
#类名为Foo,继承元祖为空,将__init__写入字典
f1 = Foo('hyj')
print("类:%s,实例:%s,实例字典:%s"%(Foo,f1,f1.__dict__))
###
类:<class '__main__.Foo'>,实例:<__main__.Foo object at 0x1038ad0f0>,实例字典:{'name': 'hyj'}
元类方法的实现原理
class Mytype(type):
def __init__(self,a,b,c):
print("这是元类初始化")
print(a,b,c)
def __call__(self, *args, **kwargs):
#print(self) #这里的self是Foo这个类
obj = object.__new__(self) #Foo类皆有object类产生实例,任何类都继承自object
self.__init__(obj,*args,**kwargs) #触发Foo.__init__(self,name)
return obj
class Foo(metaclass=Mytype): #Foo = Mytype('Foo',(),{'__init__':__init__}
def __init__(self,name):
self.name = name
f1=Foo('hyj')
print(f1.__dict__)
##运行过程
1、当定义Foo类的时候,首先会由元类进行产生,等价于Foo = Mytype('Foo',(),{'__init__':__init__}这个Mytype实例化的过程
2、实例化触发了Mytype的__init__方法
3、当Foo进行实例化的时候,触发了Mytype的__call__方法
4、object.__new__这个是由类产生实例的内部方法,借此完成Foo的实例化