在python中内置的 我已经看到了将2个参数传递给 从python3 docs看,从类内部进行调用时,这两个用例是相同的。 自python3起,是否已完全弃用带有两个参数的 我也很想知道为什么python需要这2个参数?在python3中进行 答案 0 :(得分:3) 如果您不传递参数,Python 3会努力为您提供参数。这有点麻烦,但是通常可以工作。本质上,它只是假设方法的第一个参数是 这通常有效,但是在某些情况下无效: 在 在以 如果 在极少数情况下,您可能希望显式地绕过特定的类来解析父方法,在这种情况下,您需要显式地传递一个不同于MRO后面的类的默认类,该类不同于默认情况下会拉出的类。 。这是深刻而可怕的魔术,所以我不推荐使用它,但是我认为我有理由这样做一次。 所有这些都是相对罕见的情况,因此,在大多数情况下,对于纯粹针对Python 3的代码,您可以使用no-arg 答案 1 :(得分:0) 在Python 3中,带有零参数的 Python 2并非如此,所以我想您发现的大多数代码示例实际上都是为Python 2(或与Python2 + 3兼容)编写的super()
的用例是调用覆盖的方法。这是一个使用super()
来调用Parent
类的echo
函数的简单示例:class Parent():
def echo(self):
print("in Parent")
class Child(Parent):
def echo(self):
super().echo()
print("in Child")
super()
的代码。在这种情况下,签名看起来像super(subClass, instance)
,其中subClass
是从中调用super()
的子类,而instance
是从中进行调用的实例,即{{ 1}}。因此,在上面的示例中,self
行将变为:super()
super(Child, self).echo()
?如果仅在调用覆盖函数时不推荐使用此方法,那么您可以举例说明为什么在其他情况下需要使用它们吗?super()
调用时是否注入/评估了它们,还是在这种情况下不需要它们?2 个答案:
self
(super
的第二个参数),并且在类定义完成时,它为引用{{ 1}}或super
将__class__
定义为您刚定义的类,因此无参数__class__
可以检查堆栈框架以找到super()
作为第一个参数。 / p>
__class__
中(因为第一个参数实际上不是该类),尽管实际上staticmethod
并不应该以相同的方式参与继承层次结构,所以并非完全意外。staticmethod
作为第一个参数的函数中(这是实现接受3.8之前的*args
子类之类的任意关键字参数的任何方法的唯一安全方法,当它们引入位置-仅参数)。dict
调用在嵌套范围内,则可以是隐式的,例如生成器表达式或任何形式的理解(super
,list
,set
),因为嵌套作用域未直接附加到类,因此它不会获得{ {1}}定义了附加到类本身的方法所具有的魔力。dict
,并且仅在使用您出于任何原因都不能使用它们。 No-arg __class__
更干净,更快,并且在实时开发过程中可能更正确(如果替换{{1} },该类旧版本的实例将缓存旧版本,并且no-arg super
将继续起作用,在全局变量中手动查找它会发现该类的新版本并爆炸),因此,请尽可能使用它。super()
已经是super(__class__, self)
的快捷方式。有关完整说明,请参见PEP3135。