“超级”如何知道MRO中的下一课?

时间:2016-08-24 16:19:18

标签: 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): pass

>>> D()
B.__init__
C.__init__
<__main__.D object at 0x0000000002E927B8>

C.__init__被调用并且在我的理解中super一直走过课程 D 的MRO(通常是课后的下一课 D )。因此,第一个super调用会在 B 中触发B.__init__,而第二个super调用会在 C 中触发C.__init__。其他课程中的super如何恢复到 D 的MRO中的下一个课程?

我在这里找到了一个答案,但这只解释了super的工作原理:

How does Python's super() actually work, in the general case?

根据MRO,我感兴趣的是super在其他课程中如何继续?我看不到不同类中超级对象之间的任何关联,super只接收两个参数__class__和第一个参数( self cls < /强>)。那么这些超级对象如何知道类 D 的MRO中的下一个类。可能type(self).__mro__是信息的来源,但是super如何继续iter(type(self).__mro__),因为super没有传递给其他类中的超级对象?这是由编译器处理的吗?必须在某处获得#include <iostream> #include <functional> template<typename... Args> void foo(Args ... args) { int * bar = new int(); *bar = 42; using expand_type = int[]; expand_type{( args([bar]() { std::cerr<<std::hex; std::cerr<<"&bar="<<(void*)&bar<<std::endl; std::cerr<<" bar="<<(void*)bar<<std::endl; std::cerr<<" bar="<<*bar<<std::endl<<std::endl; }), 0) ... }; }; int main() { std::function<void(std::function<void()>)> clbk_func_invoker = [](std::function<void()> f) { f(); }; foo(clbk_func_invoker, clbk_func_invoker); return 0; } 的状态信息,但我无法看到任何有形证据。

0 个答案:

没有答案