Python 类定义中的 super.init 引用正在定义的类有什么意义?

问题描述 投票:0回答:1

下面的例子取自深度学习教科书

class BERTEncoder(nn.Module):
"""BERT encoder."""
def __init__(self, vocab_size, num_hiddens, ffn_num_hiddens, num_heads,
             num_blks, dropout, max_len=1000, **kwargs):
    super(BERTEncoder, self).__init__(**kwargs)
    

接下来是常规的初始化语句,例如 self.something = Something_else super.init 指的是正在定义的类。这样做有什么意义,有什么作用?

python class super
1个回答
0
投票

TL;DR

super(BERTEncoder, self).__init__
__init__
的 MRO 中查找
self
方法,跳过
BERTEncoder
本身并从下一个类开始(在本例中为
nn.Module
)。


每个类都有一个方法解析顺序 (MRO),您可以使用该类的

mro
方法来查看它。

>>> class A: pass
...
>>> class B(A): pass
...
>>> class C(B): pass
...
>>> class D(C): pass
...
>>> D.mro()
[<class '__main__.D'>, <class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>]

super

的目的是从当前类之外的类
other开始方法查找,并且可能完全使用不同类的MRO。 super(x, y)
是一个代理对象;对象上的属性查找使用 
y
 的 MRO,但从类 
x
 开始,而不是 MRO 的 
beginning 处的任何类。

由于任何对象的 MRO 都以类本身的类型开始,因此指定类的类型可以有效地在每个祖先类中查找属性

除了类本身。

因为这无疑是使用

super

 最常见的方式,Python 3(很久以前)添加了机制,使得 
super()
 本身意味着“当前”类作为第一个参数,
self
 作为第二个参数.

© www.soinside.com 2019 - 2024. All rights reserved.