[英]Is it a good idea to use Python SQLAlchemy in AWS Lambda?
[英]Is it a good idea to use super() in Python?
或者我应该只显式引用我想调用其方法的超类?
在引用它们的构造函数时重复超类的名称似乎很脆弱,但是这个页面http://fuhm.net/super-harmful/对使用super()做了一些很好的论据。
专家Python编程一书在第3章讨论了“超级陷阱”的主题。值得一读。 以下是本书的结论:
超级用法必须保持一致:在类层次结构中,super应该在任何地方或任何地方使用。 混合超级和经典电话是一种令人困惑的做法。 人们倾向于避免超级,因为他们的代码更加明确。
编辑:今天我再次阅读本书的这一部分。 我会复制一些句子,因为超级使用很棘手:
你可以使用超级,但正如文章所说,有缺点。 只要您了解它们,使用该功能就没有问题。 就像人们说“使用组合,而不是继承”或“从不使用全局变量”。 如果该功能存在,则有一个原因。 请务必明白为什么以及明智地使用它们。
我更喜欢super(),因为它允许您更改继承的类(例如,当您重构并添加中间类时)而不更改所有方法。
人们对super
的问题更多是多重继承的问题。 所以责备super
有点不公平。 没有super
多重继承甚至更糟。 Michele Simionato在他关于super的博客文章中很好地把它包装起来:
另一方面,人们可能想知道所有超级疣是否都没有暗示某些严重问题。 很可能问题不在于super,也不在于合作方法:问题可能在于多重继承本身。
所以主要的教训是你应该尽量避免多重继承。
为了保持一致性,我总是使用super,即使单个继承它并不重要(除了不必知道父类名称的小优点)。 在Python 3+中super
更方便,所以一定要使用super。
super()试图解决多重继承的问题; 它很难复制它的语义,你肯定不应该创建任何新的语义,除非你完全确定。
对于单继承,两者之间确实没有区别
class X(Y):
def func(self):
Y.func(self)
和
class X(Y):
def func(self):
super().func()
所以我猜这只是味道的问题。
是的,你应该使用super()
不是其他方法。 这是Python 3中的标准对象继承模型。
只需坚持__init__
方法中的关键字参数,就不会有太多问题。 此外,您可以使用**kwargs
来支持未在继承链的级别中定义的其他参数。
我同意它很脆弱,但同样使用继承类的名称。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.