gpt4 book ai didi

python - 多重继承方法解析: C++ vs Python

转载 作者:搜寻专家 更新时间:2023-10-31 01:39:31 24 4
gpt4 key购买 nike

在 C++ 和 Python 处理菱形继承场景的方式上,我看到了非常不同的行为。

对于以下两个代码片段,逻辑相同但输出不同。我不明白为什么。如果有人能提供一些见解,我将不胜感激。

Python打印出“B B”

class A(object):
def foo(self):
print 'A'

class B(A):
def foo(self):
print 'B'
def bar(self):
self.foo()

class C(A):
def foo(self):
print 'C'
def bar(self):
self.foo()

class D(B, C):
def bar(self):
B.bar(self)
C.bar(self)

D().bar()

但是C++打印出“B C”

struct A
{
virtual void foo() {
cout << "A" << endl;
}
};

struct B : public A
{
virtual void foo() {
cout << "B" << endl;
}

virtual void bar() { this->foo(); }
};

struct C : public A
{
virtual void foo() {
cout << "C" << endl;
}

virtual void bar() { this->foo(); }
};

struct D : public B, public C
{
virtual void bar() {
B::bar();
C::bar();
}
};

int main()
{
D().bar();
}

当我添加 cout << typeid(*this).name() << endl; 行时每bar()上面的 C++ 方法,这是打印出来的内容:

B 0x7fff803d9b70
C 0x7fff803d9b78
D 0x7fff803d9b70

似乎BD共享相同的地址,但 C在不同的 vtable 中。

编辑

正如@JoranBeasley 的回复中所建议的,我尝试对 python 代码进行以下检查:

D.foo == B.foo
D.foo == C.foo
D.foo is B.foo
D.foo is C.foo

Python 2.7 打印出 True False False False

Python 3.4 打印出 True False True False

似乎B.fooD.foo在 python 2 和 3 中按值是相同的方法,但是 python 2 进行复制而 python 3 不进行复制。

最佳答案

我只能解释 python 位 ...

C.bar(self)

将您在其中创建的 D 实例作为 self 传递

所以当它调用 self.foo() 时这与你说 self.foo() 没有什么不同D.bar 内部(即 self 保持不变)

因为继承是从右到左完成的 B.foo阴影 C.foo

D.foo is B.foo # should print True
D.foo is C.foo # should print false

你可以粗略地总是调用

C.foo(self) #prints C as expected

这实际上与 Python 多重继承方法解析顺序无关,因为它是由 super() 处理的调用 ... 相反,您正在尝试显式调用父类方法,而不是让 python 隐式地为您解析它们

至于为什么它与 C++ 不同,是因为它是两种独立的语言,以不同的方式实现了继承和多重继承...

如评论中所述,您可以将 D 的定义更改为

class D(C,B):
...

然后 D().foo()将打印 C

关于python - 多重继承方法解析: C++ vs Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31150816/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com