假设我有一个用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中做了类似的事情就会收到警告,所以我想应该有一些“官方”的东西。
答案 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
接收的参数太少时,您将收到错误。至少,您应该为任何其他参数提供默认值,以便它们不是必需的。如果默认值不适用,那么您应该定义一个新方法,该方法可以调用超类的方法作为其实现的一部分。