『无为则无心』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.重写 在子类中如果有和父类同名的方法,则通过子类实例去调用该方法时,会调用子类中的该方法而不是父类的方法,这个 ...
随机推荐
- 《剑指offer》面试题64. 求1+2+…+n
问题描述 求 1+2+...+n ,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). 示例 1: 输入: n = 3 输出: 6 示 ...
- nRF24L01基于FIFO TX队列的发送性能优化
RF24项目代码分析 头文件 https://github.com/nRF24/RF24/blob/master/RF24.h 源文件 https://github.com/nRF24/RF24/bl ...
- 【记录一个问题】用ndk的gcc命令行无法编译C++11的lambda等语法的代码
/Users/ahfu/code/android/android-ndk-r14b/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_6 ...
- CMake语法—内置变量
目录 CMake语法-内置变量 1 CMake变量分类 1.1 普通变量 1.2 缓存变量 1.3 环境变量 1.4 内置变量 2 CMake内置变量分类 2.1 提供信息的变量 2.2 改变行为的变 ...
- 记录ABAP开发的日常——SAP_PO开发同步接口案例
前言:在项目中遇到任务PO接口,需求是SRM发送采购订单信息给SAP,SAP根据信息调用BAPI同步数据,在此作为案例记录. 本次接口采用的协议是SOAP,当然也有其他的协议比如REST等等,在此不做 ...
- Servlet-请求转发
Servlet-请求转发 请求转发:服务器收到请求后,从一个资源跳转到另一个资源的操作叫请求转发 请求转发特点: 1,浏览器地址栏没有变化 2,他们是一次请求 3,他们共享Request域中的数据 4 ...
- ansible roles实践——安装java
[root@master] /etc/ansible$ cat roles/java/tasks/main.yml ---- name: unzip jdk unarchive: src=jdk-8u ...
- 洛谷P2240 【深基12.例1】部分背包问题(经典模板)
首先应该注意几个关键信息:装走尽多的金币.所有金币可以随意分割并且分割后金币的价值比不变; 我们可以抽象成一个买东西的场景,给你一定数目的钱,让你在这些钱内尽量在超市买更多的小零食,这就牵扯到了一个性 ...
- Git 保存和恢复工作进度(stash)
感谢原文作者:滑稽的命运 原文链接:https://www.jianshu.com/p/1e65e938f93c 作用: 封存工作区与暂存区已经被Git版本控制,但没有提交(Commit)版本库的文件 ...
- Swift 介绍
简介 Swift 语言由苹果公司在 2014 年推出,用来撰写 OS X 和 iOS 应用程序 2014 年,在 Apple WWDC 发布 几家欢喜,几家愁 愁者:只学Object-C的人 欢喜者: ...