在Python中,假设obj
类型为objtype
,是super(cls,obj)
和super(cls,objtype)
相同?
super(cls,obj)
是否正确?转换obj
到另一个对象,其类是 objtype
的父类(super class)这是 cls
之后在 objtype
的 MRO 中?
super(cls,objtype)
是什么意思?那么是什么意思?
例如,给定单例设计模式的实现:
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
是一个类?它返回什么?
谢谢。
最佳答案
根据docs , super
Return a proxy object that delegates method calls to a parent or sibling class of type.
因此,super
返回一个对象,该对象知道如何调用类层次结构中其他类的方法。
super 的第二个参数是 super 绑定(bind)的对象;通常这是类的实例,但是如果在类方法或静态方法的方法上下文中调用 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.__new__
。
关于python - 假设 `obj` 的类型为 `objtype` ,那么 `super(cls,obj)` 和 `super(cls,objtype)` 是否相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46167457/