python继承中重载问题:私有函数不能被子类重写

来源:互联网 发布:linux开机启动过程 编辑:程序博客网 时间:2024/04/29 21:51

版本:3.4

在python的继承中,基类的私有函数不能被子类重写

例子

下图是私有函数的重写:
私有函数

下图是公有函数的重写:
公有函数

例子中,base类有两个函数go,run,其中run里面调用go,而extend类继承base类,并重写go函数;最后创建extend对象调用run函数:
当go函数为公有函数时,extend对象调用的run中调用的go是重写后的go函数,也就是extend类自己的go函数
当go函数为私有函数时,extend对象调用的run中调用的go却依然是基类的go函数

原因:

在官方文档中好像没有提到会出现这个问题,下面是官方文档里面关于类继承的话:

Derived classes may override methods of their base classes. Because methods have no special privileges when calling other methods of the same object, 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. (For C++ programmers: all methods in Python are effectively virtual.)

第一个黑体字部分说,子类可以重写基类的函数
第二个黑体加斜体的部分,应该是说:一个属于该基类的函数调用另一个同属于该基类的函数时,最终可能会调用子类中重写该函数的函数。
也就是说:函数a属于类A,函数b属于类A,函数bb属于类B,类B继承类A,其中函数bb重写了函数b,然后函数a里面调用函数b,当类B调用函数a时,a里面最终调用的可能是函数bb

关键是它里面用了may,又可以有两种解释,上面的是一种:存在重写函数,但还是不一定会调用;还有第二种,不知道是否存在重写函数,有因此用may,换句话说有重写函数一定用重写函数。。。

好吧,从里面我也没看出原因,不过,我自己认为的原因是这样:

在继承中,子类不能调用基类中的私有成员,因此基类的私有成员实际上对子类是不可见的,所以重写基类的私有函数的大前提就已经错了。。。而子类中的与基类一样的函数,也只是子类中的一个普通函数,因为算不上重写,因此在调用时,python的解释器根本就不采用重写函数的机制(猜的 ),因此不会调用子类中的函数。

好吧,这是我认为的,如果有错,希望大家指出

0 0