关于继承Python的方法重写

关于继承Python的方法重写,python,inheritance,methods,overriding,Python,Inheritance,Methods,Overriding,我正在阅读python 3.7文档。我对以下句子感到非常困惑: 派生类可以重写其基类的方法。由于方法在调用同一对象的其他方法时没有特权,因此调用在同一基类中定义的另一个方法的基类的方法可能最终调用重写它的派生类的方法。(对于C++程序员:Python中的所有方法都是有效的)。 您能给我看一个示例代码吗?“调用同一基类中定义的另一个方法的基类可能最终调用覆盖它的派生类的方法。”? 我的理解是: class A: def me(self): print("This is A") def

我正在阅读python 3.7文档。我对以下句子感到非常困惑:


派生类可以重写其基类的方法。由于方法在调用同一对象的其他方法时没有特权,因此调用在同一基类中定义的另一个方法的基类的方法可能最终调用重写它的派生类的方法。(对于C++程序员:Python中的所有方法都是有效的)。
您能给我看一个示例代码吗?“调用同一基类中定义的另一个方法的基类可能最终调用覆盖它的派生类的方法。”? 我的理解是:

class A:
def me(self):
    print("This is A")

def idet(self):
    self.me()


class B(A):
    def me(self):
        print("this is B")


a = A()
b = B()
b.me()
b.idet()
结果是

this is B
this is B
我不确定情况是否如此。


最后一个问题是“Python中的所有方法都是有效虚拟的”是什么意思?(我熟悉Java,但不熟悉C++)该示例准确地显示了这一原理。
b
b
的一个实例,它调用类
A
中定义的方法
ident
,该方法反过来调用
me
。由于
b
覆盖
me
,因此调用了
b
的方法,并且您得到了打印出来的
这就是我


<>在C++中,默认情况下无法重写方法——必须声明为“代码> java < /CODE >以获得此行为。在Python中(以及在Java中,您提到了您熟悉的)这是默认行为。在Java中,通过在派生类时将方法定义为
final

,可以修改方法,使其不被重写。在基类中定义方法的同时,重新定义已经存在于超类中的方法时,会将超类的所有方法复制到基类中(或超类),称为重写。当您重写子类中基类(或超类)的方法时,它会切断基类中的方法与子类之间的连接

在您的程序中,您首先调用
b.me()
,这是一个重写的方法;因此,它将从类
b
执行
me()
。然后,您得到
b.idet()
是从基类
a
复制的方法;因此,它的代码不会更改。但是,当仔细查看
idet()
方法的主体时,它会调用
me()
从中调用它的类的方法。在这种情况下,由于调用该方法的类是类
B
,它将从类
B
执行
me()
方法


idet()
已获得
self.me()
self
关键字引用了编写它的属性/方法类。

我认为Python3文档也可以提到,当类B的实例“B”引用从类a中提取的方法时,它会将自身作为第一个参数传递到该方法中(self)。因此,在任何由'b'调用的方法(包括其继承的方法)中对“self”的任何引用都将首先在类A函数之前搜索类b函数,即使'b'调用的方法是从类A派生的

b.idet()
相当于调用
b.me()

基类的一种方法,它调用 同一基类可能最终调用覆盖它的派生类的方法”


我可以看出这似乎有误导性,我认为这是因为基类A的方法
idet(self)
仅在“self”引用A的实例时调用同一基类(A)中定义的另一个方法,但在上述场景中,“self”引用子类B的实例时,
idet(self)
并没有真正调用A中定义的另一个方法,它调用了B中定义的覆盖A的方法

,所以这些语句只是描述了像Java一样覆盖的基本机制。python的覆盖是否有Java没有的特殊功能?