班级定义:
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)的用途是什么?
答案 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。