首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >假设‘obj’有类型‘objtype’,has‘super(cls,obj)’和‘Super(cls,objtype)’相同?

假设‘obj’有类型‘objtype’,has‘super(cls,obj)’和‘Super(cls,objtype)’相同?
EN

Stack Overflow用户
提问于 2017-09-12 03:31:22
回答 1查看 54关注 0票数 1

在Python中,假设obj具有objtype类型,super(cls,obj)super(cls,objtype)是否相同?

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

那么super(cls,objtype)是什么意思呢?

例如,给定Singleton设计模式的实现:

代码语言:javascript
复制
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是一个类?它还能返回什么?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-13 06:24:06

根据文档super

返回代理对象,该对象将方法调用委托给类型为类型的父类或同级类。

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

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

因此,调用super(SomeClass, cls).some_method()意味着对SomeClass派生的类调用some_method,而不是对这些类的实例进行调用。否则,super调用的行为就像实例方法中的super调用一样。

在不太复杂的代码中,这种用法看起来更自然:

代码语言:javascript
复制
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__

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46167457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档