我经常发现自己覆盖了父类的方法,并且永远无法决定是否应该明确地列出给定的参数,或者只是使用一个毯子*args, **kwargs
结构.一个版本比另一个好吗?有最好的做法吗?我缺少什么(dis-)优势?
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
Run Code Online (Sandbox Code Playgroud)
显性变体的感知益处
毯子变体的感知好处
对于我的一个站点,我需要检查是否定义了多个类属性而不是空.到目前为止,我很高兴使用if self.attr:
,在我看来是简写if self.attr is not None and self.attr is not '':
,或者属性的未定义值.
这样可以正常工作,但在检查多个字符串属性时会产生令人惊讶的行为.'' and ''
不是False
(正如我所料),但是''
.
这引出了一个问题:and
运营商是否还有其他类型强制进行类型转换bool
?我不能想出一个例子,这种行为上的差异会导致if
-clause 的实际不同结果(毕竟,''
仍然评估False
),但是我觉得有可能是陷阱的边缘情况.
最后,我想知道是否有人知道为什么这样实施?我认为Python的Zen只鼓励单向和单向,并且+
运算符似乎已经用于字符串连接的直观方式.