Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
何时需要向python super()传递参数?_Python_Python 3.x_Inheritance_Super - Fatal编程技术网

何时需要向python super()传递参数?

何时需要向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是调用的实例,即

python中内置的
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
的任何函数提供了一个虚拟闭包范围,因此,任何arg
super()
都无法检查堆栈帧,以找到
\uuuuuu类\uuuuuuuuu
作为第一个参数

这通常有效,但在某些情况下无效:

  • staticmethod
    s中(因为第一个参数实际上不是类),虽然
    staticmethod
    s实际上不应该以相同的方式参与继承层次结构,所以这并不完全出乎意料

  • 在以
    *args
    作为第一个参数的函数中(这是实现任何接受任意关键字参数的方法的唯一安全方法,如
    dict
    3.8之前的子类,当它们引入仅位置参数时)

  • 如果
    super
    调用位于嵌套作用域中,该作用域可以是隐式的,例如生成器表达式,或任何类型的理解(
    list
    set
    dict
    ),因为嵌套作用域不直接附加到类,因此,它没有获得附加到类本身的方法所获得的
    \uuuuu类\uuuuuu
    定义魔力

也有少数情况下,您可能希望显式绕过特定类来解析父方法,在这种情况下,您需要显式地在MRO中传递一个不同于默认情况下它将拉入的类的类。这是一种深刻而可怕的魔法,所以我不推荐它,但我认为我有理由这样做过一次

所有这些都是相对罕见的情况,因此大多数情况下,对于纯粹针对Python 3的代码,您可以不使用arg
super
,只有在出于任何原因无法使用时才返回显式传递参数。
no arg
super
更干净、更快,在实时开发过程中可能更正确(如果您替换
MyClass
,类的旧版本实例将缓存旧版本,并且没有arg
super
将继续工作,在全局中手动查找它将找到类的新版本并爆炸),所以尽可能地使用它。

在Python3中,具有零参数的
super()
已经是
super(\uuuuu class\uuuuu,self)
的快捷方式。有关完整的解释,请参阅

Python2并非如此,因此我猜您找到的大多数代码示例实际上都是为Python2(或与Python2+3兼容)编写的