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)多层继承和多重继承区别

图片参考:https://www.cnblogs.com/Through-Target/p/12118310.html

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、多层继承和继承中的私有成员的更多相关文章

  1. 『无为则无心』Python面向对象 — 51、私有成员变量(类中数据的封装)

    目录 1.私有成员变量介绍 (1)私有成员变量概念 (2)私有成员变量特点 (3)私有成员变量体验 2.属性私有化工作原理 3.定义成员变量的标识符规范 4.私有成员变量的获取和设置方式 1.私有成员 ...

  2. 『无为则无心』Python面向对象 — 52、私有成员方法(类中行为的封装)

    Python对于类的成员没有严格的访问控制限制,这与其他面向对象的编程语言是有所区别的. 关于私有方法其实和私有属性差不多,有如下要点: 1.通常我们约定,两个下划线开头的方法是私有方法. 2.类内部 ...

  3. 『无为则无心』Python面向对象 — 53、对Python中封装的介绍

    目录 1.继承的概念 2.继承的好处 3.继承体验 4.单继承 5.多继承 1.继承的概念 在Python中,如果两个类存在父子级别的继承关系,子类中即便没有任何属性和方法,此时创建一个子类对象,那么 ...

  4. 『无为则无心』Python面向对象 — 60、魔法属性

    目录 1.魔法属性__name__ 2.魔法属性__bases__ 3.魔法属性__mro__ 4.魔法属性__doc__ 5.魔法属性__module__ 和__class__ 6.魔法属性__di ...

  5. 『无为则无心』Python面向对象 — 45、面向对象编程

    目录 1.面向对象编程的概念 2.面向对象编程和面向过程编程的区别 (1)面向过程编程 (2)面向对象编程 3.举例理解面向对象 4.Python的面向对象编程 5.面向对象的几大核心特性 1.面向对 ...

  6. 『无为则无心』Python面向对象 — 46、类和对象

    目录 1.理解类和对象 2.类 3.对象 4.Python中的对象 5.类和对象的定义 (1)定义类 (2)创建对象 (3)练习 6.拓展:isinstance() 函数 1.理解类和对象 (1)类和 ...

  7. 『无为则无心』Python面向对象 — 56、Python多态

    目录 1.Python中的多态 (1)多态的定义 (2)多态的好处 (3)多态实现步骤 2.体验多态 1.Python中的多态 (1)多态的定义 多态是一种使用对象的方式,子类重写父类方法,不同的子类 ...

  8. 『无为则无心』Python面向对象 — 47、Python中的self详解

    目录 1.self的作用 2.self的使用注意事项 (1)self代表类的实例,而非类 (2)self不必非写成self,只是一种规范. (3)类中方法的形参中一定要写self,包括内置函数 (4) ...

  9. 『无为则无心』Python面向对象 — 54、重写和super()函数

    目录 1.重写 2.super()函数 方式一 方式二 __mro__内置类属性说明 1.重写 在子类中如果有和父类同名的方法,则通过子类实例去调用该方法时,会调用子类中的该方法而不是父类的方法,这个 ...

随机推荐

  1. 《剑指offer》面试题64. 求1+2+…+n

    问题描述 求 1+2+...+n ,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). 示例 1: 输入: n = 3 输出: 6 示 ...

  2. nRF24L01基于FIFO TX队列的发送性能优化

    RF24项目代码分析 头文件 https://github.com/nRF24/RF24/blob/master/RF24.h 源文件 https://github.com/nRF24/RF24/bl ...

  3. 【记录一个问题】用ndk的gcc命令行无法编译C++11的lambda等语法的代码

    /Users/ahfu/code/android/android-ndk-r14b/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_6 ...

  4. CMake语法—内置变量

    目录 CMake语法-内置变量 1 CMake变量分类 1.1 普通变量 1.2 缓存变量 1.3 环境变量 1.4 内置变量 2 CMake内置变量分类 2.1 提供信息的变量 2.2 改变行为的变 ...

  5. 记录ABAP开发的日常——SAP_PO开发同步接口案例

    前言:在项目中遇到任务PO接口,需求是SRM发送采购订单信息给SAP,SAP根据信息调用BAPI同步数据,在此作为案例记录. 本次接口采用的协议是SOAP,当然也有其他的协议比如REST等等,在此不做 ...

  6. Servlet-请求转发

    Servlet-请求转发 请求转发:服务器收到请求后,从一个资源跳转到另一个资源的操作叫请求转发 请求转发特点: 1,浏览器地址栏没有变化 2,他们是一次请求 3,他们共享Request域中的数据 4 ...

  7. ansible roles实践——安装java

    [root@master] /etc/ansible$ cat roles/java/tasks/main.yml ---- name: unzip jdk unarchive: src=jdk-8u ...

  8. 洛谷P2240 【深基12.例1】部分背包问题(经典模板)

    首先应该注意几个关键信息:装走尽多的金币.所有金币可以随意分割并且分割后金币的价值比不变; 我们可以抽象成一个买东西的场景,给你一定数目的钱,让你在这些钱内尽量在超市买更多的小零食,这就牵扯到了一个性 ...

  9. Git 保存和恢复工作进度(stash)

    感谢原文作者:滑稽的命运 原文链接:https://www.jianshu.com/p/1e65e938f93c 作用: 封存工作区与暂存区已经被Git版本控制,但没有提交(Commit)版本库的文件 ...

  10. Swift 介绍

    简介 Swift 语言由苹果公司在 2014 年推出,用来撰写 OS X 和 iOS 应用程序 2014 年,在 Apple WWDC 发布 几家欢喜,几家愁 愁者:只学Object-C的人 欢喜者: ...