【问题标题】:A method of a base class that calls another method defined in the same base class may end up calling a method of a derived class that overrides it一个基类的方法调用同一个基类中定义的另一个方法,最终可能会调用一个派生类的方法来覆盖它
【发布时间】:2019-12-22 08:47:25
【问题描述】:

我正在阅读 python 文档:https://docs.python.org/3/tutorial/classes.html

我无法理解以下内容:

因为方法在调用其他方法时没有特权 同一个对象,调用另一个方法的基类的方法 在同一个基类中定义的最终可能会调用一个 覆盖它的派生类。 (对于 C++ 程序员:所有方法都在 Python 实际上是虚拟的。)

假设基类 X 有方法 A,该方法在同一个基类中调用方法 B。

现在派生类 Y,比如说有方法 B,并且用户调用 Y.A()。那么,X 类的方法 A 会被调用,它会调用 Y 类的方法 B?这是作者想说的吗?

【问题讨论】:

  • 是的(Y().A() 会打电话给Y.B
  • 并且可以使用名称修饰来防止这种情况发生吗?

标签: python python-3.x


【解决方案1】:

我认为这就是他的意思

In [8]: class A:
   ...:     def foo(self):
   ...:         print ('foo')
   ...:         self.bar()
   ...:     def bar(self):
   ...:         print ('bar')
   ...:

In [9]: class B(A):
   ...:     def bar(self):
   ...:         print('bar but in b')
   ...:

In [10]: obj = B()

In [11]: obj.foo()
foo
bar but in b

在第 11 行,obj.foo() 在 B 类中调用 foo,因为它不存在,所以它转到 A 类中的 foo,然后调用 bar,因为 B 有 bar,所以它改为调用它bar 在 A 类中

如果您可以使用 pycharm 之类的调试器,那么一步一步进行操作会更容易

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    • 2017-10-17
    相关资源
    最近更新 更多