4Manuals

  • PDF Cloud HOME

您何时需要将参数传递给python super()? Download

    如何将文本边界框与pyplot.Rectangle对齐? 导入类问题 在Python数据框中选择列时出错 使用Rabbit的pika确认消息 如何在按住键的同时暂停VideoStream? Python OpenCV 将我的代码从多处理更改为普通 TypeError:无法处理此数据类型 使用buildozer不会下载sdl2_image 如何从作为请求传递的输入类型数据绑定中提取数据 SMTPSenderRefused,421,超出超时

在python中内置的super()的用例是调用覆盖的方法。这是一个使用super()来调用Parent类的echo函数的简单示例:

class Parent():
    def echo(self):
        print("in Parent")

class Child(Parent):
    def echo(self):
        super().echo()
        print("in Child")

我已经看到了将2个参数传递给super()的代码。在这种情况下,签名看起来像super(subClass, instance),其中subClass是从中调用super()的子类,而instance是从中进行调用的实例,即{{ 1}}。因此,在上面的示例中,self行将变为:

super()

从python3 docs看,从类内部进行调用时,这两个用例是相同的。

自python3起,是否已完全弃用带有两个参数的super(Child, self).echo() ?如果仅在调用覆盖函数时不推荐使用此方法,那么您可以举例说明为什么在其他情况下需要使用它们吗?

我也很想知道为什么python需要这2个参数?在python3中进行super()调用时是否注入/评估了它们,还是在这种情况下不需要它们?

2 个答案:

答案 0 :(得分:3)

如果您不传递参数,Python 3会努力为您提供参数。这有点麻烦,但是通常可以工作。本质上,它只是假设方法的第一个参数是self(super的第二个参数),并且在类定义完成时,它为引用{{ 1}}或super将__class__定义为您刚定义的类,因此无参数__class__可以检查堆栈框架以找到super()作为第一个参数。 / p>

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

  • 在__class__中(因为第一个参数实际上不是该类),尽管实际上staticmethod并不应该以相同的方式参与继承层次结构,所以并非完全意外。

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

  • 如果dict调用在嵌套范围内,则可以是隐式的,例如生成器表达式或任何形式的理解(super,list,set),因为嵌套作用域未直接附加到类,因此它不会获得{ {1}}定义了附加到类本身的方法所具有的魔力。

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

所有这些都是相对罕见的情况,因此,在大多数情况下,对于纯粹针对Python 3的代码,您可以使用no-arg dict,并且仅在使用您出于任何原因都不能使用它们。 No-arg __class__更干净,更快,并且在实时开发过程中可能更正确(如果替换{{1} },该类旧版本的实例将缓存旧版本,并且no-arg super将继续起作用,在全局变量中手动查找它会发现该类的新版本并爆炸),因此,请尽可能使用它。

答案 1 :(得分:0)

在Python 3中,带有零参数的super()已经是super(__class__, self)的快捷方式。有关完整说明,请参见PEP3135。

Python 2并非如此,所以我想您发现的大多数代码示例实际上都是为Python 2(或与Python2 + 3兼容)编写的



Similar searches
    如何在SQL查询中解析多个名称空间xml 使用C中的UDP广播进行iRobot Roomba发现 Samsung RFG237AAWP Refrigerator User Manual 为什么我得到无法识别的参数:[查询] 如何在Material-UI中添加自托管字体