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

标签 python oop

在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/

相关文章:

python - 需要在python中的迭代器的开头添加一个元素

python - Django 表格 : how do is_valid() and validation errors work together?

C 中的 Java 实现(可能特定于平台)

oop - 这种设计模式的名称?

python - 包括特定字段值的唯一在一起约束

python - 如何在 SQLAlchemy for SQLServer 中定义 ID 列的起始值?

C# 等同于 C++ friend 关键字?

oop - 如何以 OOP 方式编写 main()?

c# - 接口(interface)会在子类中自动实现吗?

python - “dict”对象没有属性 'data'