我经常在覆盖子类中的方法时执行此操作:
def method_x(self):
x = super(type(self), self).method_x()
[Some extra code]
return x
Run Code Online (Sandbox Code Playgroud)
我的问题是:超级(类型(自我),自我)是否有捷径?
Dun*_*can 18
不要这样做:如果super可以只使用type(self)它作为它的第一个参数,那么它就不会被编写为首先采用两个参数.你必须在这里传递实际的类,而不是一个表达式,如果类被子类化,它可能会改变.
super的第一个参数需要是包含当前方法定义的类,因为你要告诉super在开始搜索的列表中的位置.
Python 3知道这一点,并super()在编译时神奇地对待,但在Python 2.x中它只是一个普通的函数,所以它无法为自己找出这些参数.
[编辑添加到我的初始点]实际上,super()在Python 2.x中使用另一种较少使用的方法.您可以使用未绑定的超级形式,并在访问它时绑定它:
>>> class A(object):
def foo(self):
print "A.foo"
>>> class B(A):
def foo(self):
self.__super.foo()
print "B.foo"
>>> B._B__super = super(B)
>>> class C(A):
def foo(self):
self.__super.foo()
print "C.foo"
>>> C._C__super = super(C)
>>> class D(C,B): pass
>>> D._D__super = super(D)
>>> D().foo()
A.foo
B.foo
C.foo
Run Code Online (Sandbox Code Playgroud)
这里有一个重要的难题:你必须使用不同的名称来存储每个super对象,您可以通过使用做self.__super,但你不能创建一个未绑定的super类定义直接(因为如果它不"你不能将类命名但是如果你在外面创建它,你必须手动模糊名称,以确保__super为类设置正确的对象.对于Python 2.6及更高版本,您可以将其作为类装饰器进行封装.
| 归档时间: |
|
| 查看次数: |
3847 次 |
| 最近记录: |