Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.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”怎么知道MRO的下一个班级?_Python - Fatal编程技术网

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
和第一个参数(selfcls)。那么这些超级对象如何知道类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行;你可以从中看到它。