什么是python中的超级(类型)?

时间:2014-03-21 04:24:12

标签: python inheritance super

班级定义:

class A(object):
    def foo(self):
        print "A" 


class B(object):
    def foo(self):
        print "B" 


class C(A, B): 
    def foo(self):
        print "C"

输出:

>>> super(C)
<super: <class 'C'>, NULL>
>>> super(C).foo
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'super' object has no attribute 'foo'

如果我们无法访问类的属性,那么super(type)的用途是什么?

3 个答案:

答案 0 :(得分:7)

super(type)是一个“未绑定”的超级对象。 super上的文档讨论了这个问题,但没有详细说明“未绑定”的超级对象是什么或做了什么。这只是语言的一个事实,你不能以你试图使用它们的方式使用它们。

这可能是你想要的:

>>> super(C, C).foo is B.foo
True

那就说,未绑定的超级对象有什么用呢?我必须自己查看这个问题,并找到一个不错的答案here。但请注意,文章的结论是,未绑定的超级语言是一种语言疣,没有实际用途,应该从语言中删除(并且阅读了文章,我同意)。文章对未绑定超级的解释始于:

  

必须将未绑定的超级对象转换为绑定对象才能使它们正确分派。这可以通过描述符协议来完成。例如,我可以用这种方式转换绑定到c1的超级对象中的super(C1):

>>> c1 = C1()
>>> boundsuper = super(C1).__get__(c1, C1) # this is the same as super(C1, c1)

所以,这似乎没用,但文章继续:

  

确定未绑定语法不返回未绑定方法后,可能会问其目的是什么。答案是super(C)旨在用作其他类中的属性。然后,描述符魔术将自动转换绑定语法中的未绑定语法。例如:

>>> class B(object):
...     a = 1
>>> class C(B):
...     pass
>>> class D(C):
...     sup = super(C)
>>> d = D()
>>> d.sup.a
1
     

d.sup.a调用super(C).__get__(d,D).a后调整为super(C, d).a并检索B.a,这是有效的。

     

我所知道的super的单参数语法有一个用例,但我认为它带来的麻烦多于优点。用例是Guido在他的关于新式课程的论文中实现的autosuper。

     

我们的想法是将未绑定的超级对象用作私有属性。例如,在我们的示例中,我们可以将类__sup中的私有属性C定义为未绑定的超级对象super(C)

>>> C._C__sup = super(C)

但请注意,文章继续描述这个问题(它不能正常工作,我认为主要是因为MRO依赖于你正在处理的实例的类,因此给定一个实例,一些类X的超类可能会有所不同,具体取决于我们给出的X实例。

答案 1 :(得分:1)

要完成你想要的,你需要这样称呼它:

>>> myC = C()
>>> super(C,myC).foo()
A

答案 2 :(得分:0)

请注意,对某个对象有NULL个引用。它基本上需要一个类一个相关对象的实例才能运行。

>>> super(C, C()).foo
<bound method C.foo of <__main__.C object at 0x225dc50>>

有关详细信息,请参阅:Understanding Python super() with __init__() methods