何时需要向python super()传递参数?
python中内置的何时需要向python super()传递参数?,python,python-3.x,inheritance,super,Python,Python 3.x,Inheritance,Super,python中内置的super()的一个用例是调用重写的方法。下面是一个使用super()调用Parent类的echo函数的简单示例: class父对象(): def回波(自身): 打印(“在父级中”) 班级儿童(家长): def回波(自身): super().echo() 打印(“在子项中”) 我见过将两个参数传递给super()的代码。在这种情况下,签名看起来像super(subClass,instance)其中subClass是调用super()的子类,而instance是调用的实例,即
super()
的一个用例是调用重写的方法。下面是一个使用super()
调用Parent
类的echo
函数的简单示例:
class父对象():
def回波(自身):
打印(“在父级中”)
班级儿童(家长):
def回波(自身):
super().echo()
打印(“在子项中”)
我见过将两个参数传递给super()
的代码。在这种情况下,签名看起来像super(subClass,instance)
其中subClass
是调用super()
的子类,而instance
是调用的实例,即self
。因此,在上面的示例中,super()
行将变成:
super(Child,self).echo()
现在来看,当从类内部调用时,这两个用例是相同的
从python3开始,使用两个参数调用super()
是否已被完全弃用?如果这只是不推荐用于调用重写函数,那么您能否举例说明为什么在其他情况下需要它们
我还想知道python为什么需要这两个参数?它们是在python3中进行
super()
调用时注入/计算的,还是在这种情况下不需要它们?如果不传递参数,python3会尽力为您提供这些参数。这有点麻烦,但通常是有效的。本质上,它只是假设方法的第一个参数是self
(super的第二个参数),当类定义完成时,它为引用super
或将\uu class\uuuu定义为刚定义的类的\uu class\uuuu
的任何函数提供了一个虚拟闭包范围,因此,任何argsuper()
都无法检查堆栈帧,以找到\uuuuuu类\uuuuuuuuu
作为第一个参数
这通常有效,但在某些情况下无效:
- 在
staticmethod
s中(因为第一个参数实际上不是类),虽然staticmethod
s实际上不应该以相同的方式参与继承层次结构,所以这并不完全出乎意料
- 在以
*args
作为第一个参数的函数中(这是实现任何接受任意关键字参数的方法的唯一安全方法,如dict
3.8之前的子类,当它们引入仅位置参数时)
- 如果
super
调用位于嵌套作用域中,该作用域可以是隐式的,例如生成器表达式,或任何类型的理解(list
,set
,dict
),因为嵌套作用域不直接附加到类,因此,它没有获得附加到类本身的方法所获得的\uuuuu类\uuuuuu
定义魔力
也有少数情况下,您可能希望显式绕过特定类来解析父方法,在这种情况下,您需要显式地在MRO中传递一个不同于默认情况下它将拉入的类的类。这是一种深刻而可怕的魔法,所以我不推荐它,但我认为我有理由这样做过一次
所有这些都是相对罕见的情况,因此大多数情况下,对于纯粹针对Python 3的代码,您可以不使用argsuper
,只有在出于任何原因无法使用时才返回显式传递参数。no argsuper
更干净、更快,在实时开发过程中可能更正确(如果您替换MyClass
,类的旧版本实例将缓存旧版本,并且没有argsuper
将继续工作,在全局中手动查找它将找到类的新版本并爆炸),所以尽可能地使用它。在Python3中,具有零参数的super()
已经是super(\uuuuu class\uuuuu,self)
的快捷方式。有关完整的解释,请参阅
Python2并非如此,因此我猜您找到的大多数代码示例实际上都是为Python2(或与Python2+3兼容)编写的