【问题标题】:Doesn't Python's super() built-in violate DRY?Python 的 super() 内置不违反 DRY 吗?
【发布时间】:2013-11-05 03:51:15
【问题描述】:

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

这是 Python docs 中给出的示例:

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

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

【问题讨论】:

标签: python python-2.7


【解决方案1】:

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

在 Python 3 中,super() 已被修改为不需要类名,只要函数是在类中定义的——所以除非你是猴子补丁,否则这不是问题。

【讨论】:

    【解决方案2】:

    在 python 中手动调用 self 的方式相同 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
    

    【讨论】:

      猜你喜欢
      • 2010-11-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-04
      • 2014-02-15
      • 1970-01-01
      • 2016-07-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多