#所有的类都是元类的对象;
#其实,我们可以自定制元类,去控制我们想要的效果;
#自定制元类:继承type元类;(下面的代码,讲述了类实例化的原理)
'''
类实例化,生成一个对象;首先,会触发__call__()方法的运行,
而__call__()方法内,又有self.__init__()去实现属性的添加入属性字典__dict__
'''
class MyType(type):
'''
自定制元类,即:写一个类,继承type元类
'''
def __init__(self,*args,**kwargs):
pass
def __call__(self, *args, **kwargs):
'''
该自定制元类的对象类的实例化时,就会触发该__call__()方法
:param args:
:param kwargs:
:return: 返回对象:obj
'''
obj=object.__new__(self)#object.__new__(该自定制类的对象:如:Foo)-->f1
self.__init__(obj,*args, **kwargs)#Foo.__init__(f1,*args, **kwargs),这里调用的是obj的__init__(),而不是元类的;
return obj
#上面已写好了自定制元类,下面就用这个自定制元类来生成一个类Foo
class Foo(metaclass=MyType):#Foo=MyType(Foo,"Foo",(object,),{})
'''
这里必须写上:metaclass=自定制元类
否则,默认还是type元类
'''
def __init__(self,name):
self.name=name #f1.name=name
#上面类已写好;下面实例化,生成对象f1
f1=Foo("zhangsan")#类名(参数)---》触发:__call__(),在__call__()里面,又调用了__init__(),实现属性进入属性字典
print(f1.__dict__)
print(Foo.__dict__)
python:元类(二):自定制元类,实例化原理
最新推荐文章于 2022-08-06 08:40:40 发布