【问题标题】:Is it a bad practice to change the number of arguments of an overridden class method in Python?在 Python 中更改重写的类方法的参数数量是一种不好的做法吗?
【发布时间】:2014-01-17 17:36:26
【问题描述】:

假设我有一个用 Python 编写的类,如下所示:

class Foo(object):
    """My fake class"""

    def mymethod(self, first_arg):
        """original method"""
        pass

现在假设我定义了一个扩展前一个类的新类,并且我想覆盖 mymethod

class Bar(Foo):
    """My new class"""

    def mymethod(self, first_arg, second_arg):
        """overridden method"""
        return first_arg == second_arg

更改被覆盖方法中的参数数量是一种不好的做法吗?

编辑:

对此有任何官方的“良好做法”规则吗? 我刚刚看到如果你在 pydev 中做这样的事情你会收到一个警告,所以我想应该有一些“官方”的东西。

【问题讨论】:

标签: python overriding


【解决方案1】:

除非您为额外的参数提供默认值,否则我会说这是一个坏主意。你拥有它的方式,如果你创建一个 Bar 的实例,任何不了解 Bar 并且只知道你的对象是 Foo(它是)的人在尝试使用 mymethod 时都会出错。但是如果你做def mymethod(self, first_arg, second_arg="some default"),那么即使他们没有通过第二个参数,他们也会没事的。

如果您能够做到这一点,这通常意味着您只是在方法中添加“详细信息”,而未提供这些详细信息的调用仍将以默认方式工作。

如果您无法创建适当的默认参数值,我会认为这表明您定义的行为足够不同,以至于您需要创建一个新方法。

【讨论】:

  • 对我来说这个主意不错。我认为有人一直这样做,尤其是__init__
【解决方案2】:

考虑以下几点:

objects = [ Foo(), Foo(), Bar(), Bar(), Foo() ]

for obj in objects:
    obj.mymethod(some_value)

这应该可行,因为Bar 对象应该可以在任何需要Foo 对象的地方使用,但是当Bar.mymethod 接收的参数太少时,您会收到错误消息。至少,您应该给任何附加参数一个默认值,这样它们就不是绝对必要的。如果默认值不适用,那么您应该定义一个新方法,该方法可以调用超类的方法作为其实现的一部分。

【讨论】:

    猜你喜欢
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    相关资源
    最近更新 更多