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. 我选择了MySQL和SpringData JPA

    我是3y,一年CRUD经验用十年的markdown程序员‍常年被誉为优质八股文选手 今天想跟大家聊聊数据库层面上的事,austin项目继续更新(注:今天聊的数据库都特指关系型数据库) 01.数据库选择 ...

  2. 园子的推广博文:欢迎收看 Apache Flink 技术峰会 FFA 2021 的视频回放

    园子专属收看链接:https://developer.aliyun.com/special/ffa2021/live#?utm_content=g_1000316459 Flink Forward 是 ...

  3. C# - 逆变的具体应用场景

    前言 早期在学习泛型的协变与逆变时,网上的文章讲解.例子算是能看懂,但关于逆变的具体应用场景这方面的知识,我并没有深刻的认识. 本文将在具体的场景下,从泛型接口设计的角度出发,逐步探讨逆变的作用,以及 ...

  4. 处理json中的空格

    很多json中带有空格 而json解析类很多自带去空行 导致解析json如下 只能在解析之前用"111111"之类的替换 之后再替换回来 result = result.Repla ...

  5. JAVA主要类集分类

    包装类 Integer包装类 方法 返回值 功能描述 byteValue() byte 以 byte 类型返回该 Integer 的值 intValue() int 以 int 型返回此 Intege ...

  6. vue文档1-VSCode介绍

    开发工具VSCode: Vue的开发工具用的是VSCode(Visual Studio Code),这款开发工具是微软官方出品,开源,免费,并且功能相当强大,使用者很多,插件相当丰富,是Vue开发的不 ...

  7. 【Vue源码学习】响应式原理探秘

    最近准备开启Vue的源码学习,并且每一个Vue的重要知识点都会记录下来.我们知道Vue的核心理念是数据驱动视图,所有操作都只需要在数据层做处理,不必关心视图层的操作.这里先来学习Vue的响应式原理,V ...

  8. 学习Java第9天

    今天所作的工作: 反射,枚举类型与泛型 明天工作: 1.线程 2.网络通信 所遇到的问题及解决方法: 反射基本思想,泛型类似于类模板. 理解反射太难了,转悠了好半天,关键是理解反射的思想,才容易学.

  9. Pycharm 使用备忘

    1.打开方法定义 快捷方式:[ctrl+左键]或者[Ctrl+B] 如果点击之后,打开不是[.py]文件,而是[.pyi]文件,可以把下面红框的参数删掉. 2.设置文件开头默认注释 # *_* cod ...

  10. Java枚举类在生产环境中的使用方式

    前言   Java枚举在项目中使用非常普遍,许多人在做项目时,一定会遇到要维护某些业务场景状态的时候,往往会定义一个常量类,然后添加业务场景相关的状态常量.但实际上,生产环境的项目中业务状态的定义大部 ...