在Python中更改重写类方法的参数数量是不好的做法?

时间:2013-12-30 19:35:38

标签: python method-overriding

假设我有一个用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中做了类似的事情就会收到警告,所以我想应该有一些“官方”的东西。

2 个答案:

答案 0 :(得分:5)

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

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

如果你不能创建一个合适的默认参数值,我会把它作为一个标志,表明你正在定义不同的行为,而不是你需要制作一个新的方法。

答案 1 :(得分:3)

请考虑以下事项:

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

for obj in objects:
    obj.mymethod(some_value)

这应该有效,因为Bar对象应该可以在Foo对象的任何地方使用,但是当Bar.mymethod接收的参数太少时,您将收到错误。至少,您应该为任何其他参数提供默认值,以便它们不是必需的。如果默认值不适用,那么您应该定义一个新方法,该方法可以调用超类的方法作为其实现的一部分。