进一步认识__new__和__call__

1.关于__init__

class F00(object):
def __init__(self,name):
self.name = name
print("Foo--init--")
def __new__(cls, *args, **kwargs):
print("Foo--new--")
return object.__new__(cls)#cls表示将Foo类传进__new__方法中,表示继父类的__new__方法



f= F00("name")
#当存在return object.__new__(cls)时,先后输出Foo--new--和Foo--init--,说明__new__执行在__init__之前
#当去掉return object.__new__(cls)时,只输出Foo--new--,说明__init__实例时没有被实例
#总结:__new__方法是类里面自带的,new是用户来创建实例的,默认不写,可以重写
#作用:在实例化时会先于__init__执行,我们想在实例化之前




2.关于__call__

class MyType(type):
def __init__(self,what,bases=None,dict=None):
super(MyType, self).__init__(what,bases,dict)
def __call__(self, *args, **kwargs):
obj=self.__new__(self,*args, **kwargs)
self.__init__(obj)

class Foo(object):#底层是通过MyType类的 __init__方法实现的
__metaclass__ =MyType
def __init__(self,name):#底层是通过MyType类的__call__方法的self.__init__(obj)实现的
self.name = name
def __new__(cls, *args, **kwargs):
return object.__new__(cls)#底层是通过MyType类的__call__方法的obj=self.__new__(self,*args, **kwargs)实现的



obj=Foo("name")#执行创建Foo的实例其实是执行MyType类的__call__方法
#__call__作用时用于创建__new__的

转载于:https://www.cnblogs.com/zfquan/p/7568105.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值