python的super()内置是否违反dry?

Doesn't Python's super() built-in violate DRY?

这显然是有原因的,但我没有足够的经验去认识它。

这是python文档中给出的示例:

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

是否没有一种方法可以从实例方法中"知道"类型,而不依赖于复制类"c"的名称?似乎示例可能导致类名更新,但超级函数调用中的类型参数变为过时的情况?


一方面,dry更多的是关于大量代码被复制的部分;另一方面,是的,super()调用中的类名可能会变得过时(这发生在我身上)。

在python 3中,只要函数在类中定义,super()就已经被修改为不需要类名,所以这不是问题,除非您正在进行monkey修补。


在python super中,手工调用self的方法也是一个简单的函数,我的意思是,python函数不知道执行上下文。例如,这种行为适用于猴子修补。

例如,我从Pypi中获取了您的C类,您每个月都会更新它,因为它是一个有用的类。我想修改它的方法行为,这样它将使用您的C类更新我的其他需求的行为:

1
2
3
4
5
6
7
8
from utils import do_magic
from a import C

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

C.method = method