Python “super”怎么知道MRO的下一个班级?
搜索属性时,Python “super”怎么知道MRO的下一个班级?,python,Python,搜索属性时,super如何知道下一个类?没有代码,这些问题很模糊: 从学习Python 5E书籍开始: class B: def __init__(self): print('B.__init__') super().__init__() class C: def __init__(self): print('C.__init__') super().__init__() class D(B, C): pa
super
如何知道下一个类?没有代码,这些问题很模糊:
从学习Python 5E书籍开始:
class B:
def __init__(self):
print('B.__init__')
super().__init__()
class C:
def __init__(self):
print('C.__init__')
super().__init__()
class D(B, C): pass
>>> D()
B.__init__
C.__init__
<__main__.D object at 0x0000000002E927B8>
B类:
定义初始化(自):
打印('B.\uuuuu init\uuuuuuu')
super()。\uuuu init\uuuuu()
C类:
定义初始化(自):
打印('C.\uuuu init\uuuuuu')
super()。\uuuu init\uuuuu()
D(B、C)级:及格
>>>D()
B.。u_init__
C.uu init__
C.\uuuu init\uuuu
被调用,据我所知,super
一路走过D班的MRO(通常是下一节课D)。因此,第一个super
调用在B中触发B.\uuuu init\uuuu
,第二个super
调用在C中触发C.\uu init\uuuu
。其他课程中的super
如何恢复到D的MRO中的下一个课程
我在这里找到了一个答案,但这只是解释了super
通常是如何工作的:
我感兴趣的是,根据MRO,
super
如何在其他类中继续?我看不到不同类中的超级对象之间的任何连接,super
只接收两个参数\uuuuuuuuu
和第一个参数(self或cls)。那么这些超级对象如何知道类D的MRO中的下一个类呢。有可能是type(self)。\uuuMRO\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu?这是由编译器处理的吗?肯定有super
的状态信息,但我看不到任何具体的证据 我看到你已经链接到我以前关于这个问题的一个答案。答案中的代码非常清楚地解释了super
如何知道从哪里开始查找。这个答案怎么没有回答你的问题呢?还有,第一个调用触发了C.\uu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu,我只想问你一个问题:\uuu getattribute\uuu
在这种情况下不是比\uu getattr\uuuu
更具代表性吗?您使用的\uuuuu getattr\uuuuuuuuuu
不适用于运算符重载方法(例如,\uuuuuuu init\uuuuuuuuu
),使用编码的super
类将始终从super
类本身返回\uuuuuuuuu init\uuucode>。除此之外,我想说你的代码大大简化了故事,所以谢谢你。是的,它不是内置的super
的完美代表。它也不处理第二个参数是类的情况,或者没有提供第二个参数的情况,或者Python3的0参数魔术,还有一些其他更深奥的特殊情况,我也没有处理,因为我试图将重点放在MRO行走逻辑上。真正的super
实现是391行;你可以从中看到它。