文档章节

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

python-yzw
 python-yzw
发布于 2017/06/05 14:25
字数 686
阅读 23
收藏 0
点赞 0
评论 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的解释器根本就不采用重写函数的机制(猜的 ),因此不会调用子类中的函数。

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

© 著作权归作者所有

共有 人打赏支持
python-yzw
粉丝 3
博文 85
码字总数 42624
作品 0
深圳
程序员
Python面向对象编程之我见

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

bigstone2012 ⋅ 05/31 ⋅ 0

python面向对象笔记(what)

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

PowerMichael ⋅ 04/24 ⋅ 0

Python面向对象之运算符重载

运算符重载只是意味着在类方法中拦截内置的操作,也就是说当类的实例出现在内置操作中,Python自动调用我们的方法,并且我们的方法的返回值变成了相应操作的结果。 关于重载的关键知识点: ...

bigstone2012 ⋅ 06/08 ⋅ 0

Python学习日记七(面向对象,继承)

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

HaleyLiu ⋅ 04/12 ⋅ 0

python面向对象编程全解

全栈工程师开发手册 (作者:栾鹏) python教程全解 python面向对象编程全解。 面向对象技术简介 类(Class):用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属...

luanpeng825485697 ⋅ 2017/12/04 ⋅ 0

对python中接口的一些认识

什么是接口 ? 接口只是定义了一些方法,而没有去实现,多用于程序设计时,只是设计需要有什么样的功能,但是并没有实现任何功能,这些功能需要被另一个类(B)继承后,由 类B去实现其中的某...

yongwan5637 ⋅ 05/31 ⋅ 0

深度剖析isinstance的检查机制

起步 通过内建方法 可以判断一个对象是否是某个类的实例。但你是否想过关于鸭子协议的对象是如何进行判断的呢? 比如 类的父类是继 类的,但通过 返回的却是真,难道 list 是可迭代的子类? ...

Python中文社区 ⋅ 05/09 ⋅ 0

Python 面向对象

Python 面向对象   Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的。本章节我们将详细介绍Python的面向对象编程。   如果你以前没有接...

文弱书生_罗剑 ⋅ 2015/10/09 ⋅ 0

NDK开发---C++学习(六):继承、多态

前言 前面我们已经介绍过了C++中的类与函数,不熟悉的,可以去看看 NDK开发---C++学习(三):类与函数(上) NDK开发---C++学习(四):类与函数(中) NDK开发---C++学习(五):类与函数(...

浮生若梦zp ⋅ 2017/11/27 ⋅ 0

[Python] (Day-17) - 面向对象

If you focus on what you left behind you will never see what lies ahead! 如果你只顾回头看,永远也看不见前方有什么。 面向对象编程()介绍 编程是利用“类”和“对象”来创建各种模型来...

Mazy ⋅ 2017/10/23 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring发展历程总结

转自与 https://www.cnblogs.com/RunForLove/p/4641672.html 目前很多公司的架构,从Struts2迁移到了SpringMVC。你有想过为什么不使用Servlet+JSP来构建Java web项目,而是采用SpringMVC呢?...

onedotdot ⋅ 17分钟前 ⋅ 0

Python模块/包/库安装(6种方法)

Python模块/包/库安装(6种方法) 冰颖机器人 2016-11-29 21:33:26 一、方法1: 单文件模块 直接把文件拷贝到 $python_dir/Lib 二、方法2: 多文件模块,带setup.py 下载模块包(压缩文件zip...

cswangyx ⋅ 36分钟前 ⋅ 0

零基础学习大数据人工智能,学习路线篇!系统规划大数据之路?

大数据处理技术怎么学习呢?首先我们要学习Python语言和Linux操作系统,这两个是学习大数据的基础,学习的顺序不分前后。 Python:Python 的排名从去年开始就借助人工智能持续上升,现在它已经...

董黎明 ⋅ 44分钟前 ⋅ 0

openJdk和sun jdk的区别

使用过LINUX的人都应该知道,在大多数LINUX发行版本里,内置或者通过软件源安装JDK的话,都是安装的OpenJDK, 那么到底什么是OpenJDK,它与SUN JDK有什么关系和区别呢? 历史上的原因是,Ope...

jason_kiss ⋅ 54分钟前 ⋅ 0

梳理

Redux 是 JavaScript 状态容器,提供可预测化的状态管理。 它是JS的状态容器,是一种解决问题的方式,所以即可以用于 react 也可以用于 vue。 需要理解其思想及实现方式。 应用中所有的 stat...

分秒 ⋅ 今天 ⋅ 0

Java 后台判断是否为ajax请求

/** * 是否是Ajax请求 * @param request * @return */public static boolean isAjax(ServletRequest request){return "XMLHttpRequest".equalsIgnoreCase(((HttpServletReques......

JavaSon712 ⋅ 今天 ⋅ 0

Redis 单线程 为何却需要事务处理并发问题

Redis是单线程处理,也就是命令会顺序执行。那么为什么会存在并发问题呢? 个人理解是,虽然redis是单线程,但是可以同时有多个客户端访问,每个客户端会有 一个线程。客户端访问之间存在竞争...

码代码的小司机 ⋅ 今天 ⋅ 0

到底会改名吗?微软GVFS 改名之争

微软去年透露了 Git Virtual File System(GVFS)项目,GVFS 是 Git 版本控制系统的一个开源插件,允许 Git 处理 TB 规模的代码库,比如 270 GB 的 Windows 代码库。该项目公布之初就引发了争...

linux-tao ⋅ 今天 ⋅ 0

笔试题之Java基础部分【简】【二】

1.静态变量和实例变量的区别 在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变...

anlve ⋅ 今天 ⋅ 0

Lombok简单介绍及使用

官网 通过简单注解来精简代码达到消除冗长代码的目的 优点 提高编程效率 使代码更简洁 消除冗长代码 避免修改字段名字时忘记修改方法名 4.idea中安装lombnok pom.xml引入 <dependency> <grou...

to_ln ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部