在Python中,假设obj具有objtype类型,super(cls,obj)和super(cls,objtype)是否相同?
super(cls,obj)将obj转换为另一个对象,其类是objtype的超类,它在objtype的MRO中位于cls之后,这是正确的吗?
那么super(cls,objtype)是什么意思呢?
例如,给定Singleton设计模式的实现:
class Singleton(object):
_singletons = {}
def __new__(cls, *args, **kwds):
if cls not in cls._singletons:
cls._singletons[cls] = super(Singleton, cls).__new__(cls)
return cls._singletons[cls]Singleton的任何子类(不进一步覆盖__new__ )都有一个实例。
super(Singleton, cls)是什么意思,cls是一个类?它还能返回什么?
谢谢。
发布于 2017-09-13 06:24:06
根据文档,super
返回代理对象,该对象将方法调用委托给类型为类型的父类或同级类。
因此,super返回一个对象,它知道如何调用类层次结构中其他类的方法。
super的第二个参数是绑定super的对象;通常这是类的一个实例,但是如果在类方法或静态方法的上下文中调用super,那么我们希望调用类对象本身上的方法,而不是实例。
因此,调用super(SomeClass, cls).some_method()意味着对SomeClass派生的类调用some_method,而不是对这些类的实例进行调用。否则,super调用的行为就像实例方法中的super调用一样。
在不太复杂的代码中,这种用法看起来更自然:
class C(SomeBaseClass):
def method(self):
# bind super to 'self'
super(C, self).method()
@classmethod
def cmethod(cls):
# no 'self' here -- bind to cls
super(C, cls).cmethod()注意,super(C, cls)在python2中是必需的,但是在python3中空的super()就足够了。
在单例中,super(Singleton, cls).__new__(cls)返回调用object.__new__(cls) ( Singleton的一个实例)的结果。它是以这种方式创建的,以避免递归调用Singleton.__new__。
https://stackoverflow.com/questions/46167457
复制相似问题