【发布时间】:2013-01-15 14:00:31
【问题描述】:
我经常发现自己覆盖了父类的方法,并且永远无法决定是否应该显式列出给定的参数,或者只是使用一揽子*args, **kwargs 构造。一个版本比另一个更好吗?有最佳实践吗?我缺少什么(缺点)优点?
class Parent(object):
def save(self, commit=True):
# ...
class Explicit(Parent):
def save(self, commit=True):
super(Explicit, self).save(commit=commit)
# more logic
class Blanket(Parent):
def save(self, *args, **kwargs):
super(Blanket, self).save(*args, **kwargs)
# more logic
显式变体的感知好处
- 更明确(Python 之禅)
- 更容易掌握
- 功能参数轻松访问
毯式变体的感知好处
- 更干燥
- 父类很容易互换
- 父方法中默认值的更改无需接触其他代码即可传播
【问题讨论】:
-
这很大程度上取决于您所子类化的内容...如果您很有可能要向基类的方法添加(或其他人)额外的 kwargs,坚持使用
**kwargs很有意义。如果这不太可能,那么从可读性的角度来看,明确指定 kwargs 肯定要好得多。 -
好吧,你肯定是在丢弃信息。 显式优于隐式等等。
-
您有两个选择:1) 显式命名参数和 禁止 派生类中的签名更改(否则使用
super和多重继承祝你好运),或 2) 使用 @ 987654325@ 并允许更改方法的签名。应该使用哪一个可能取决于具体情况。 -
使用 *args 和 **kwargs 很难创建正确的文档字符串,vsc 中的智能感知,pycharm 编辑器不接受它们
标签: python inheritance method-signature