Python的super()内置不会违反DRY吗?

时间:2013-10-25 21:38:15

标签: python python-2.7

显然有一个原因,但我没有足够的经验来识别它。

这是Python docs中给出的示例:

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

是否有一种方法可以在实例方法中“了解”不依赖于复制类“C”名称的类型?似乎这个例子可能会导致更新类名但超级函数调用中的类型参数变得陈旧的情况?

2 个答案:

答案 0 :(得分:2)

一方面,DRY更多的是重复的大部分代码;另一方面,是的,super()电话中的班级名称可能会变得陈旧(这种情况发生在我身上)。

在Python 3中,super()已被修改为不需要类名,只要该函数在类中定义 - 所以除非你进行猴子修补,否则不会出现问题。

答案 1 :(得分:1)

在python super中手动调用self是一个简单的函数,我的意思是,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