基本方法和子方法签名中的参数数量不一致
Inconsistency in number of parameters in base and child methods signatures
我有一个 Base
class 具有特定方法和 w/o 任何参数:
class Base():
def pretty_method(self):
print('Hi!')
还有几个子classes,它们需要在pretty_method
中使用新参数x
进行额外处理。
class A(Base):
def pretty_method(self, x):
super().pretty_method()
print('X in A is {}'.format(x))
class B(Base):
def pretty_method(self, x):
super().pretty_method()
print('X in B is {}'.format(x))
所以在那种情况下,我在 class 方法签名中存在不一致。
另一方面,我可以处理 base class:
中未使用的 x
参数
class Base():
def pretty_method(self, x=None):
print('Hi!')
这有点没用,但可以保持签名的一致性。
哪种方法更可取?
在派生的 class 中添加新属性/方法是可以的,删除它们不是因为它违反了 Liskov substitution principle。
考虑:(现代)Python 中的所有 class 都派生自 object
,如果不添加新的属性和/或方法,它们将毫无用处。因此,将新参数添加到派生的 class 的 __init__
方法中是完全正常的。
当然,如果您希望派生的大多数 class 使用 x
参数,那么也可以将它添加到基础 class 中,即使尽管基础 class 本身并不使用它。
在相关说明中,通常的做法是向基 class 添加方法,基 class 本身不使用但派生的 class 是预期的覆盖。在这种情况下,基本方法引发 NotImplemented
是正常的。您 不需要 在基础 class 中提供此类方法,但如果有人忘记在其派生 class.
我有一个 Base
class 具有特定方法和 w/o 任何参数:
class Base():
def pretty_method(self):
print('Hi!')
还有几个子classes,它们需要在pretty_method
中使用新参数x
进行额外处理。
class A(Base):
def pretty_method(self, x):
super().pretty_method()
print('X in A is {}'.format(x))
class B(Base):
def pretty_method(self, x):
super().pretty_method()
print('X in B is {}'.format(x))
所以在那种情况下,我在 class 方法签名中存在不一致。
另一方面,我可以处理 base class:
中未使用的x
参数
class Base():
def pretty_method(self, x=None):
print('Hi!')
这有点没用,但可以保持签名的一致性。 哪种方法更可取?
在派生的 class 中添加新属性/方法是可以的,删除它们不是因为它违反了 Liskov substitution principle。
考虑:(现代)Python 中的所有 class 都派生自 object
,如果不添加新的属性和/或方法,它们将毫无用处。因此,将新参数添加到派生的 class 的 __init__
方法中是完全正常的。
当然,如果您希望派生的大多数 class 使用 x
参数,那么也可以将它添加到基础 class 中,即使尽管基础 class 本身并不使用它。
在相关说明中,通常的做法是向基 class 添加方法,基 class 本身不使用但派生的 class 是预期的覆盖。在这种情况下,基本方法引发 NotImplemented
是正常的。您 不需要 在基础 class 中提供此类方法,但如果有人忘记在其派生 class.