gpt4 book ai didi

python - 如何表达调用派生虚拟的基类方法?

转载 作者:太空宇宙 更新时间:2023-11-04 11:05:04 25 4
gpt4 key购买 nike

在python中如何在C++中执行以下操作?

B* b = new D();
b->virtual_fn();

哪个会在 D 中调用 virtual_fn。是否有一种引用形式可以做到这一点?

最佳答案

在 Python 中,值具有类型而不是变量。后者只是它们当前绑定(bind)到的值的有用名称。由于变量没有类型,如果您创建一个 D 对象并将变量绑定(bind)到它,那么您将获得 D 类显式定义的方法和 B 没有被替换的类。实际上,一切都是虚拟的。

现在如果你想在B中调用一个在D中被替换的方法,你必须调用该方法并传递self明确地。这是一个为保护无辜者而篡改 id() 的示例。

>>> class B(object):
... def virtual_fn(self):
... print 'in B.virtual_fn() for', id(self)
... def other_virtual_fn(self):
... print 'in B.other_virtual_fn() for', id(self)
... def call_virtual(self):
... print 'in B.call_virtual() for', id(self)
...
>>> class D(B):
... def virtual_fn(self):
... print 'in D.virtual_fn() for', id(self)
...
>>> b_obj = B()
>>> d_obj = D()
>>> id(b_obj)
1
>>> id(d_obj)
2
>>>
>>> b_obj.virtual_fn()
in B.virtual_fn() for 1
>>> d_obj.virtual_fn()
in D.virtual_fn() for 2
>>> d_obj.other_virtual_fn()
in B.other_virtual_fn() for 2
>>>
>>> B.virtual_fn(d_obj)
in B.virtual_fn() for 2
>>>
>>> d_obj.call_virtual()
in B.call_virtual() for 2
in D.virtual_fn() for 2
>>>

请记住,d_obj.virtual_fn() 本质上D.virtual_fn(d_obj) 的语法糖。因此,如果您想显式调用基类的隐藏方法,则无需 - B.virtual_fn(d_obj)。我强烈建议阅读 Method Resolution Order (mro)来自 Python 2.3 的文档。它确实解释了所有这一切是如何运作得很好的。

编辑

再次阅读问题后,我添加了 call_virtual 内容,因为我很确定这是您感兴趣的内容。

关于python - 如何表达调用派生虚拟的基类方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1907182/

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