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;
}
的状态信息,但我无法看到任何有形证据。