文档章节

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

python-yzw
 python-yzw
发布于 2017/06/05 14:25
字数 686
阅读 26
收藏 0

在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的解释器根本就不采用重写函数的机制(猜的 ),因此不会调用子类中的函数。

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

本文转载自:http://blog.csdn.net/name_z/article/details/49020231

共有 人打赏支持
python-yzw
粉丝 3
博文 89
码字总数 43434
作品 0
深圳
程序员
ParisGabriel:Python全栈工程师(0基础到精通)教程 第二十八课(多继承、函数重写)

ParisGabriel 每天坚持手写 一天一篇 决定坚持几年 为了梦想为了信仰   开局一张图                       Python人工智能从入门到精通 补充:  对象 ------------...

ParisGabriel
07/27
0
0
Python面向对象编程之我见

面向对象基本概念 面向对象是一种编程范式。范式是指一组方法论。编程范式是一组如何组织代码的方法论。编程范式指的是软件工程中的一种方法学。 一些主流的编程范式: OOP - 面向对象编程 ...

bigstone2012
06/29
0
0
史上最全的Python面向对象知识点疏理

面向对象技术简介 类: 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。 类变量:类变量在整个实例化的对象中是公用的。类变量定义...

乐乎无趣
2017/11/03
0
0
掌握面向对象编程本质,彻底掌握OOP

面向对象基本概念 面向对象是一种编程范式。范式是指一组方法论。编程范式是一组如何组织代码的方法论。编程范式指的是软件工程中的一种方法学。 一些主流的编程范式: OOP - 面向对象编程 ...

bigstone2012
07/26
0
0
python面向对象笔记(what)

python面向对象笔记(what) 1.什么是面向对象? 对象相当于把函数和全局变量封装起来,属相相当于全局变量,方法相当于函数。 不同对象相互隔离,全局变量互不影响。 2.什么是隐藏属性? 在方...

PowerMichael
04/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

以太坊总结

一、概念说明 1.以太坊(Ethereum blockchain)由V神(Vitalik Buterin)发明,是一个交易记录的永久数据库,它以一个“无信任”的交易系统来运行,不需要任何第三方信任机构即可进行点对点的...

盼望明天
28分钟前
1
0
Java并发工具类——AtomicInteger

基本类型int的递增等操作并不是线程安全的,加上synchronized又会影响性能,因此在并发情况下我们应该使用AtomicInteger,下面通过一个例子验证一哈。 public class TestAtomicInteger {...

东都大狼狗
30分钟前
1
0
基于CentOS7.2系统对RabbitMQ单机版安装过程

准备虚拟机系统 我的系统如下 系统版本7.2 安装perl yum install perl 安装wget工具 yum install -y wget 安装相关依赖工具 yum install ncurses ncurses-base ncurses-devel ncurses-libs ...

凌晨一点
34分钟前
1
0
Maven常用命令

Maven常用命令 说到命令,则不得不提一下环境变量,在之前的博文中简单提了一下环境变量的配置,这里具体说一下。说完环境变量的配置,然后就是Maven的常用命令,这里说的是常用的几个命令,...

星汉
50分钟前
0
0
Flink操作mysql kafka和hbase

主程序 package com.streaming.flink;import java.util.Properties;import org.apache.flink.api.common.functions.FlatMapFunction;import org.apache.flink.api.common.functi......

守望者之父
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部