假设`obj`有类型`objtype`,那么`super(cls,obj)`和`super(cls,objtype)`是一样的吗?

时间:2017-09-12 03:31:22

标签: python python-3.x singleton super

在Python中,假设obj的类型为objtypesuper(cls,obj)super(cls,objtype)是否相同?

super(cls,obj)obj转换为另一个对象,其类是objtype的超类,在cls的MRO中objtype之后是否正确?

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是哪一类?它又回归了什么?

感谢。

1 个答案:

答案 0 :(得分:1)

根据docssuper

  

返回一个代理对象,该方法将方法调用委托给类型的父类或兄弟类。

所以super返回一个知道如何调用类层次结构中其他类的方法的对象。

super的第二个参数是super绑定的对象;通常这是类的一个实例,但是如果在类方法或static方法的方法的上下文中调用super,那么我们想要在类对象本身而不是实例上调用该方法。

所以调用super(SomeClass, cls).some_method()意味着在some_method下降的上调用SomeClass,而不是在这些类的实例上调用。否则,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()

请注意,python2中需要super(C, cls),但python3中的空super()就足够了。

在您的单例示例中,super(Singleton, cls).__new__(cls)返回调用object.__new__(cls)的结果,Singleton的实例。它是以这种方式创建的,以避免递归调用Singleton.__new__