当我在python中实现naivesingleton时,我遇到了一个超级关键字的问题。像往常一样,超人的行为总是很狡猾和有缺陷的,希望有人能对此有所启示。谢谢:)
问题是:
class Singleton(object):
def __new__(cls,*args,**kw):
if not hasattr(cls,'_instance'):
#create a instance of type cls,
origin=super(Singleton,Singleton).__new__(cls,*args,**kw)
cls._instance=origin
return cls._instance
class B(Singleton):
def __init__(self,b):
self.b=b
它确实有效,但我想知道
如果我把第5行改成下面的行会更好吗,就像大多数书中那样?在
^{pr2}$有什么区别?在
super()
在当前对象的MRO中搜索下一个具有所请求属性的类。super()
的第一个参数确定MRO搜索的起点,第二个参数确定从中获取MRO的对象。在只要不使用多重继承,MRO就很简单。^在这种情况下,{}将始终位于MRO中的同一位置。对于多重继承,子类的MRO中出现
Singleton
的位置会有所不同,您确实希望使用cls
来获得当前的MRO,而不是仅仅是Singleton
的MRO。在对于您的简单示例,忽略
cls
(例如B
)是可以的:因此}最终在同一个子列表中搜索,只找到
super(Singleton, Singleton)
和{object
。在但是,使用多重继承,您将得到一个非常不同的MRO;请注意,}之间:
^{pr2}$Foo
列在Singleton
和{如果使用
super(Singleton, Singleton)
,那么在查找继承方法时,Foo
将被无意中跳过。super(Singleton, cls)
将搜索(Foo, object)
,super(Singleton, Singleton)
将只查看object
。在相关问题 更多 >
编程相关推荐