『无为则无心』Python面向对象 — 55、多层继承和继承中的私有成员
1、Python支持多层继承
故事继续:N年后,徒弟老了,想要把所有技术传承给自己的徒弟。
(1)多层继承实现
# 1.创建师父类,属性和方法
class Master(object):
def __init__(self):
self.kongfu = '[古法煎饼果子配方]'
def make_cake(self):
print(f'运用{self.kongfu}制作煎饼果子')
# 2.独创配方
class Prentice(Master):
def __init__(self):
self.kongfu = '[独创煎饼果子配方]'
def make_cake(self):
self.__init__()
print(f'运用{self.kongfu}制作煎饼果子')
# 古法煎饼
def make_master_cake(self):
super().__init__()
super().make_cake()
# 3.徒孙类继承徒弟
class Tusun(Prentice):
pass
# 步骤:
# 创建Tusun对象,
xiaotusun = Tusun()
# 徒孙使用各种做法
xiaotusun.make_cake()
xiaotusun.make_master_cake()
(2)多层继承和多重继承区别

2、继承中的私有成员
私有成员包括私有成员变量和私有成员方法。
(1)继承中父类私有属性和私有方法
子类可以继承父类中所有的成员,包括私有成员,特殊成员。但是父类中的私有实例属性和私有实例方法,在子类没有执行权限的。
故事继续:徒弟把技术传承给徒孙的同时,不想把自己的钱(8000000个亿)继承给徒孙,这个时候就要为
钱这个实例属性设置私有权限。
# 1.独创配方
class Prentice():
def __init__(self):
self.kongfu = '[独创煎饼果子配方]'
# 定义私有属性,资产
self.__money = 8000000
# 摊煎饼
def make_cake(self):
self.__init__()
print(f'运用{self.kongfu}制作煎饼果子')
# 定义私有方法
def __tellMe(self):
print(self.kongfu)
print(self.__money)
def make_cake(self):
self.__init__()
print(f'运用{self.kongfu}制作煎饼果子')
# 徒孙类
class Tusun(Prentice):
pass
xiaoqiu = Tusun()
# 子类对象调用父类的共有方法,可以
xiaoqiu.make_cake()
# 子类对象调用父类的公有属性,可以
print(f"煎饼做法流派{xiaoqiu.kongfu}")
# 子类对象调用父类的私有属性
# 不可以报错:
# AttributeError: 'Tusun' object has no attribute '__money'
# print(f"煎饼做法流派{xiaoqiu.__money}")
# 子类对象调用父类的私有方法
# 不可以,报错
# AttributeError: 'Tusun' object has no attribute '__tellMe'
# xiaoqiu.__tellMe()
"""
# 下面的方式子类可以直接访问父类的私有成员
注意:
子列对象不能直接访问父类的私有成员的原理
和类中的私有属性私有方法的原理是一样的。
不明白的可以去看前边的文章,私有成员变量。
"""
print(f"煎饼做法流派{xiaoqiu._Prentice__money}")
xiaoqiu._Prentice__tellMe()
注意:子类可以继承父类中所有的成员,但是没有权限使用父类的私有属性和私有方法。
(2)获取和修改私有属性值
在Python中,一般定义函数名get_xx用来获取私有属性,定义set_xx用来修改私有属性值。
# 1.独创配方
class Prentice():
def __init__(self):
self.kongfu = '[独创煎饼果子配方]'
# 定义私有属性,资产
self.__money = 8000000
# 摊煎饼
def make_cake(self):
self.__init__()
print(f'运用{self.kongfu}制作煎饼果子')
# 定义私有方法
def __tellMe(self):
print(self.kongfu)
print(self.__money)
def make_cake(self):
self.__init__()
print(f'运用{self.kongfu}制作煎饼果子')
# 获取私有属性
def get_money(self):
return self.__money
# 修改私有属性
def set_money(self, money):
self.__money = money
# 徒孙类
class Tusun(Prentice):
pass
# 创建Tusun对象
xiaoTusun = Tusun()
# 获取子类对象继承父类的私有money
print(xiaoTusun.get_money()) # 8000000
# 设置子类对象中,父类的私有属性
xiaoTusun.set_money(18888)
# 在次查看
print(xiaoTusun.get_money()) # 18888
# 在创建一个新的Tusun对象
xiaoTusun2 = Tusun()
# 获取子类对象继承父类的私有money
# 可以看到结果是# 8000000
# 说明上边修改的私有属性是对象中的父类继承的私有属性
# 和父类中的私有属性无关
print(xiaoTusun2.get_money()) # 8000000
总结:
子类可以继承父类中所有的成员,但是没有权限使用父类的私有属性和私有方法。
但是父类中定义了访问父类中私有变量的
getter()和setter()方法,子类也是可以继承到的。子类对象中可以通过继承到的
getter()和setter()方法,去修改和获取子类对象中所继承私有成员变量。
『无为则无心』Python面向对象 — 55、多层继承和继承中的私有成员的更多相关文章
- 『无为则无心』Python面向对象 — 51、私有成员变量(类中数据的封装)
目录 1.私有成员变量介绍 (1)私有成员变量概念 (2)私有成员变量特点 (3)私有成员变量体验 2.属性私有化工作原理 3.定义成员变量的标识符规范 4.私有成员变量的获取和设置方式 1.私有成员 ...
- 『无为则无心』Python面向对象 — 52、私有成员方法(类中行为的封装)
Python对于类的成员没有严格的访问控制限制,这与其他面向对象的编程语言是有所区别的. 关于私有方法其实和私有属性差不多,有如下要点: 1.通常我们约定,两个下划线开头的方法是私有方法. 2.类内部 ...
- 『无为则无心』Python面向对象 — 53、对Python中封装的介绍
目录 1.继承的概念 2.继承的好处 3.继承体验 4.单继承 5.多继承 1.继承的概念 在Python中,如果两个类存在父子级别的继承关系,子类中即便没有任何属性和方法,此时创建一个子类对象,那么 ...
- 『无为则无心』Python面向对象 — 60、魔法属性
目录 1.魔法属性__name__ 2.魔法属性__bases__ 3.魔法属性__mro__ 4.魔法属性__doc__ 5.魔法属性__module__ 和__class__ 6.魔法属性__di ...
- 『无为则无心』Python面向对象 — 45、面向对象编程
目录 1.面向对象编程的概念 2.面向对象编程和面向过程编程的区别 (1)面向过程编程 (2)面向对象编程 3.举例理解面向对象 4.Python的面向对象编程 5.面向对象的几大核心特性 1.面向对 ...
- 『无为则无心』Python面向对象 — 46、类和对象
目录 1.理解类和对象 2.类 3.对象 4.Python中的对象 5.类和对象的定义 (1)定义类 (2)创建对象 (3)练习 6.拓展:isinstance() 函数 1.理解类和对象 (1)类和 ...
- 『无为则无心』Python面向对象 — 56、Python多态
目录 1.Python中的多态 (1)多态的定义 (2)多态的好处 (3)多态实现步骤 2.体验多态 1.Python中的多态 (1)多态的定义 多态是一种使用对象的方式,子类重写父类方法,不同的子类 ...
- 『无为则无心』Python面向对象 — 47、Python中的self详解
目录 1.self的作用 2.self的使用注意事项 (1)self代表类的实例,而非类 (2)self不必非写成self,只是一种规范. (3)类中方法的形参中一定要写self,包括内置函数 (4) ...
- 『无为则无心』Python面向对象 — 54、重写和super()函数
目录 1.重写 2.super()函数 方式一 方式二 __mro__内置类属性说明 1.重写 在子类中如果有和父类同名的方法,则通过子类实例去调用该方法时,会调用子类中的该方法而不是父类的方法,这个 ...
随机推荐
- python极简教程06:生成式和装饰器
测试奇谭,BUG不见. 这一场,主讲python的生成式和装饰器. 目的:掌握四种生成式(列表.生成器.集合.字典),装饰器的原理和使用. 生成式 01 什么是生成式? 能够用一行代码,快速高效的生成 ...
- 《剑指offer》面试题32 - II. 从上到下打印二叉树 II
问题描述 从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行. 例如: 给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 ...
- ProE许可、PTC许可、Creo许可、许可分析、分析许可
Pro/Engineer操作软件(又简称ProE)是美国参数技术公司(PTC)旗下的CAD/CAM/CAE一体化的三维软件,Creo是美国PTC公司于2010年10月推出CAD设计软件包,creo是P ...
- es6中的导入与导出
参考:https://www.cnblogs.com/sherrycat/p/11152994.html
- java继承成员函数特点
1 //成员函数. 2 /* 3 * 当子父类中出现成员函数一模一样的情况,会运行子类的函数. 4 * 这种现象,称为覆盖操作.这时函数在子父类中的特性. 5 * 函数两个特征: 6 * 1,重载. ...
- 集合框架-TreeSet-Comparator比较器练习(字符串长度排序)
1 package cn.itcast.p5.treeset.test; 2 3 import java.util.Iterator; 4 import java.util.TreeSet; 5 6 ...
- phpstudy后门POC分析和EXP开发
POC 2019年9月20日,网上传出 phpStudy 软件存在后门,随后作者立即发布声明进行澄清,其真实情况是该软件官网于2016年被非法入侵,程序包自带PHP的php_xmlrpc.dll模块被 ...
- Docker常用命令速查
docker pull ${CONTAINER NAME} #拉取镜像 docker images #查看本地所有镜像 docker ps #查看所有正在运行的容器,加-q返回id docker ps ...
- Python与Javascript相互调用超详细讲解(四)使用PyNode进行Python与Node.js相互调用项(cai)目(keng)实(jing)践(yan)
目录 前提 安装 使用 const pynode = require('@fridgerator/pynode')的时候动态链接错误 ImportError: math.cpython-39-x86_ ...
- Idea内存设置idea.vmoptions无效的解决办法
原因:貌似是因为maven的问题 解决办法 结果