2013-10-25 36 views
3

这显然有一个原因,但我没有足够的经验来认识它。不是Python的super()内置违反DRY?

这是在Python docs给出的例子:

class C(B): 
    def method(self, arg): 
     super(C, self).method(arg) # Why do we have to mention 'C' again? 

是不是有“知”的类型从一个不依赖于复制类“名称的实例方法中的一种方式C'?看起来像这个例子可能会导致类名更新但超级函数调用中的类型参数变为陈旧的情况?

+1

这可能是在Py3中允许'super()。method(arg)'的原因之一。 – glglgl

+1

我认为在py3中不再是这种情况 –

+1

在Python 3中,你可以说'super()'。它需要Python 2中不存在的编译时分析。 –

回答

1

同样的方式self在python手动调用super是一个简单的函数,我的意思是,python函数不知道执行上下文。例如,这种行为对于猴子修补很实用。

例如,我从pypi上取下了你的C类,并且每个月都会更新它,因为它是一个有用的类。我想修改它的方法,行为,所以它会使用你的C类更新的其他的我的要求的行为举止:

from utils import do_magic 
from a import C 

def method(self, arg): 
    super(C, self).method(arg) 
    do_magic(self) 

C.method = method 
2

,一方面,干更多的是被复制大段代码;另一方面,是的,super()调用中的类名称可能会变陈旧(这发生在我身上)。

在Python 3中,super()已被修改为不需要类名称,只要该函数在类中定义 - 除非您是猴子修补程序,否则不是问题。