python 元类的call总结_Python元类中的__call__和__new__的区别?

参考文档

问题描述

下面这两段代码的执行结果反映了一个问题:很明显元类的存在会影响__call__和__new__的优先级,请问大神能否分析一下两者执行结果不同的原因?

实例代码

1.不含元类的单例模式

class Singleton(object):

def __new__(cls, *args, **kwargs):

if not hasattr(cls, '_instance'):

cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)

print('__new__')

return cls._instance

def __call__(cls, *args, **kwargs):

if not hasattr(cls, '_instance'):

cls._instance = super(Singleton, cls).__call__(*args, **kwargs)

print('__call__')

return cls._instance

class Foo(Singleton):

pass

print('1')

foo1 = Foo()

print('2')

foo2 = Foo()

print(foo1 is foo2) # True

上面这段代码的执行结果

$ python non_metaclass.py

1

__new__

2

__new__

True

2.含有元类的单例模式

class Singleton(type):

def __new__(cls, *args, **kwargs):

if not hasattr(cls, '_instance'):

cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)

print('__new__')

return cls._instance

def __call__(cls, *args, **kwargs):

if not hasattr(cls, '_instance'):

cls._instance = super(Singleton, cls).__call__(*args, **kwargs)

print('__call__')

return cls._instance

class Foo(metaclass=Singleton):

# 不兼容Python2

pass

print('1')

foo1 = Foo()

print('2')

foo2 = Foo()

print (foo1 is foo2) # True

上面这段代码的执行结果

$ python metaclass.py

__new__

1

__call__

2

__call__

True

如果描述不够详细,请在评论区留一下言,我再改进。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值