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. JVM调优2-远程监控

    监控远程JVM VisualJVM不仅是可以监控本地jvm进程,还可以监控远程的jvm进程,需要借助于JMX技术实现. 什么是JMX JMX(Java Management Extensions,即J ...

  2. 对极验geetest滑块验证码图片还原算法的研究

    免责声明 本文章所提到的技术仅用于学习用途,禁止使用本文章的任何技术进行发起网络攻击.非法利用等网络犯罪行为,一切信息禁止用于任何非法用途.若读者利用文章所提到的技术实施违法犯罪行为,其责任一概由读者 ...

  3. python实现--九九乘法表

    1 for i in range(1,10): 2 for j in range(1,i+1): 3 print("%d*%d=%d"%(j,i,j*i),end="\t ...

  4. 网络编程-TCP连接的建立与终止

    TCP是一个面向连接的协议.无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接. 1.建立连接 请求端(通常称为客户)发送一个 SYN 段指明客户打算连接的服务器的端口,以及初始序号( I ...

  5. 网络编程-基于Websocket聊天室(IM)系统

    目录 一.HTML5 - Websocket协议 二.聊天室(IM)系统的设计 2.1.使用者眼中的聊天系统 2.2.开发者眼中的聊天系统 2.3.IM系统的特性 2.4.心跳机制:解决网络的不确定性 ...

  6. 刚进公司,不懂GIt工作流的我瑟瑟发抖

    前言 不懂git工作流,被辞退了! 之前在看到这句话的时候,我刚实习入职不久,瑟瑟发抖.好巧不巧,今天又看到了类似的文章讲git重要性的. 眼下,学校导师安排给我的课题组了一个新的工程项目,使用git ...

  7. 【机器学习】kNN

    机器学习算法--kNN 目录 机器学习算法--kNN 1. 算法原理 2. 算法实现 2.1 kd-tree构造 2.2 kd-tree查询 2.3 kNN算法实现 3. 算法测试 Ref 1. 算法 ...

  8. DEEP LEARNING WITH PYTORCH: A 60 MINUTE BLITZ | TRAINING A CLASSIFIER

    你已经知道怎样定义神经网络,计算损失和更新网络权重.现在你可能会想, 那么,数据呢? 通常,当你需要解决有关图像.文本或音频数据的问题,你可以使用python标准库加载数据并转换为numpy arra ...

  9. springmvc复习导图

    spingmvcweb请求

  10. GoLang设计模式20 - 组合模式

    定义 组合模式是一种结构型设计模式. 当我们想把一组对象当做一个整体来处理时就可以考虑使用组合模式. 组合模式被视为是接口型设计模式是因为它将一组对象组装为一个树状结构.这个树状结构中的每个独立组件都 ...