求问 Python 单例模式__new__函数执行顺序

2018-05-18 17:05:18 +08:00
 ilucio
有两个类 A、B 均为单例,B 继承 A。实例化 B 时发现会先执行 B 的__new__函数,然后再执行 A 的__new__函数,请问各位大佬这是为什么?

class A(object):
_instance = None
def __new__(cls, *args, **kw):
if not cls._instance:
print 'create A instance'
cls._instance = super(A, cls).__new__(cls, *args, **kw)
else:
print 'instance A exists'
return cls._instance

def __init__(self):
print 'A'

class B(A):
_instance = None
def __new__(cls,*args,**kw):
if not cls._instance:
print 'create B instance'
cls._instance = super(B, cls).__new__(cls, *args, **kw)
else:
print 'instance B exists'
return cls._instance

def __init__(self):
print 'B'

b1=B()

输出为:
create B instance
create A instance
B
2442 次点击
所在节点    Python
5 条回复
SKYNE
2018-05-18 17:51:50 +08:00
Python3 下没输出 B, 不太懂,也想知道为什么。
weyou
2018-05-18 18:57:01 +08:00
执行顺序没问题啊,你认为应该什么顺序呢。Python3 下没输出 B 是因为你的__new__函数创建实例后没有将实例返回,将后面 else 中的 return 减少一个缩进就可以了。
ilucio
2018-05-19 09:31:23 +08:00
我的是 2.7 环境,会输出 B
ilucio
2018-05-19 09:36:25 +08:00
困惑的地方有两点:1、为什么会生成 A 的实例? 2、B 是继承于 A,为什么不是先生成 A 的实例然后生成 B 的实例?
wwqgtxx
2018-05-19 10:28:57 +08:00
@ilucio 对于第二个问题,在 B 继承与 A 的情况下,当然是先创建 B,然后在创建 B 的过程中完成创建 A 的所有步骤再继续完成创建 B

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/455953

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX