2011-10-10 74 views

回答

14

不能使用裸super()呼叫不含类型/类。你也不能实施可以工作的替代品。 Python的3.x中含有特殊的支持,以使裸super()电话(它放置在一个类中定义的所有功能__class__细胞变量 - 见PEP 3135

+1

谢谢。我很困惑,因为这个PEP的早期版本说你会用'from __future__ import new_super'导入它,这不起作用。 –

6

不,你不能。但是你可以使用Python 2的super()在Python 3

3

注意这是一个可怕的“解决方案”,我把它张贴只!请确保您这样做在家里
我再说一遍:不这样做

有人可能会考虑使用该混入

class Super(object): 
    def super(self): 
     return super(self.__class__, self) 

获得self.super()

class A(object, Super): 
    def __init__(self): 
     print "A" 

class B(A): 
    def __init__(self): 
     print "B" 
     self.super().__init__() 

产生:

>>> a = A() 
A 
>>> b = B() 
B 
A 

但要注意:self.super()不等同于super(B, self) - 如果A也称为self.super().__init__(),一个B的建设将导致A构造函数无限期地自行调用,因为self.__class__将保持B 。这是由于缺少accepted answer中提到的__class__。您可以使用隐藏状态机或复杂的元类来解决此问题,例如检查实际班级在self.__class__.mro()中的位置,但真的值得吗?可能不是...

15

我意识到这个问题已经过时,所选的答案在当时可能是正确的,但它不再完整。您仍然不能使用2.5.6 super(),但python-future为2.6+一个back-ported implementation

% pip install future 
... 
% python 
... 
>>> import sys 
>>> sys.version_info[:3] 
(2, 7, 9) 
>>> from builtins import * 
>>> super 
<function newsuper at 0x000000010b4832e0> 
>>> super.__module__ 
'future.builtins.newsuper' 
>>> class Foo(object): 
... def f(self): 
... print('foo') 
... 
>>> class Bar(Foo): 
... def f(self): 
... super().f() # <- whoomp, there it is 
... print('bar') 
... 
>>> b = Bar() 
>>> b.f() 
foo 
bar 

如果使用pylint,你可以用注释禁用传统的警告:

# pylint: disable=missing-super-argument 
+0

不错,谢谢:) –

相关问题