0804Python总结-单继承,多继承,菱形继承,__init__魔术方法(构造方法)
一.继承 -> 单继承
如果一个类继承另外一个类,
该类叫做子类(衍生类),被继承的类叫做父类(基类,超类)继承:(1)单继承 (2)多继承
python中,所有的类都默认继承object
class Human(object):hair = "黑色"sex = "男"def cry(self):print("人类在伤心的时候,会流下鳄鱼的眼泪")def eat(self):print("人类在远古时候,捉到猎物直接吃")def __makebaby(self):print("人类在发育到成熟的时候,会造人")
1.子父继承之后,子类可以调用父类的公有成员
class Man(Human):passobj =Man()
print(obj.hair) # 黑色
obj.cry() # 人类在伤心的时候,会流下鳄鱼的眼泪
2.子父继承之后,子类不能调用父类的私有成员
class Woman(Human):def pub_func(self):self.__makebaby()obj = Woman()
# obj.__makebaby() error
# obj.pub_func() error
3.子类继承之后,子类可以改写父类中的方法
子父继承之后
如果子类里面有该成员属性或者方法,优先调用自己的
如果没有该成员,调用父类中的成员
如果都没有,直接报错
class Children(Human):sex = "女性"def cry(self):print("小孩只会哇哇哇的哭")obj = Children()
obj.cry() # 小孩只会哇哇哇的哭
print(obj.__dict__) # {}
print(Children.__dict__) # {'__module__': '__main__', 'sex': '女性', 'cry': <function Children.cry at 0x000002C694025D90>, '__doc__': None}
二.多继承
1.基本语法
class Father():property = "风流倜傥,一表人才,一枝梨花压海棠"def f_hobby(self):print("社会摇,蹦迪,吃喝嫖赌,大保健")class Mother():property = "闭月羞花,倾国倾城,一枝红杏出墙来"def m_hobby(self):print("打麻将,打牌,喝酒抽烟烫头,跳广场舞")class Daughter(Father, Mother):pass# 实例化对象
obj = Daughter()
print(obj.property) # 风流倜傥,一表人才,一枝梨花压海棠
obj.m_hobby() # 打麻将,打牌,喝酒抽烟烫头,跳广场舞
2.super用法
(1)super本身是一个类 super()是一个对象 用于调用父类的绑定方法
(2)super() 只应用在绑定方法中,默认自动传递self对象 (前提:super所在作用域存在self)
(3)super用途:解决复杂的多继承调用顺序
class Father():property = "风流倜傥,一表人才,一枝梨花压海棠"def f_hobby():print("社会摇,蹦迪,吃喝嫖赌,大保健")class Mother():property = "闭月羞花,倾国倾城,一枝红杏出墙来"def m_hobby(self):print("打麻将,打牌,喝酒抽烟烫头,跳广场舞")class Son(Father, Mother):property = "喜欢打游戏,wow,lol,dnf,泡泡堂,cf,dota,大话西游,跑跑卡丁车,吃鸡"# 1.利用类调用父类的成员def skill1(self):Father.f_hobby()print(Mother.property)# 2.利用对象调用父类的成员def skill2(self):self.m_hobby()print(self.property)# 3.利用super调用父类属性和方法"""super()只调用父类的相关成员,不会调用自己的本类成员,父类没有直接报错super()在调用父类方法时,只调用父类的绑定方法,默认传递参数是本类的对象self"""def skill3(self):# print(super())print(super().property)super().m_hobby()# super().f_hobby() errorobj = Son()
print("======")
obj.skill1() # 社会摇,蹦迪,吃喝嫖赌,大保健 闭月羞花,倾国倾城,一枝红杏出墙来
print("======")
obj.skill2() # 打麻将,打牌,喝酒抽烟烫头,跳广场舞 喜欢打游戏,wow,lol,dnf,泡泡堂,cf,dota,大话西游,跑跑卡丁车,吃鸡
print("======")
obj.skill3() # 风流倜傥,一表人才,一枝梨花压海棠 打麻将,打牌,喝酒抽烟烫头,跳广场舞
self 和 super()的区别
self 在调用成员时,先看看自己的类对象中是否存在该成员,如果有调用自己的,如果没有,调用父类的,如果都没有报错
super() 在调用成员时,只调用父类的相关成员(属性,绑定方法),永远不会调用自己的,如果父类没有,直接报错
三.菱形继承(钻石继承)
"""Human
Man WomanChildren
"""
class OldWoman():passclass Human():pty = 4def feelT(self):print("原始人类如果热了,脱皮1")print(self.pty)print("原始人类如果冷了,扒别人的皮2")class Man(Human):# pty = 3def feelT(self):print("现代男人如果热了,脱衣服,脱裤子3")super().feelT()print("现代男人如果冷了,脱别人的衣服,脱别人的裤子4")class Woman(Human):# pty = 2def feelT(self):print("现代女人如果热了,吹空调,吃雪糕5")super().feelT()print("现代女人如果冷了,喝热水,用暖宝宝6")class Children(Man, Woman):# pty = 1def feelT(self):print("现代小孩如果热了,就哭7")super().feelT()print("现代小孩如果冷了,也要哭8")obj = Children()
obj.feelT()
73512648
# mro 列表: super用途的一个体现,解决复杂的多继承调用顺序关系
"""
类.mro() 返回的是方法调用顺序列表,针对于多继承下的同名方法,按照顺序依次的进行调用
"""
lst = Children.mro()
print(lst)
"""
[
<class '__main__.Children'>,
<class '__main__.Man'>,
<class '__main__.Woman'>,
<class '__main__.Human'>,
<class 'object'>
]
"""
issubclass 判断子父关系(应用在类当中,判断子父关系)
“”“只要在一条继承链上即可(有血缘关系)”""
res = issubclass(Children, Man)
print(res) # True
res = issubclass(Children, Woman)
print(res) # True
res = issubclass(Children, Human)
print(res) # True
res = issubclass(Children, (Human, Woman, Man, OldWoman))
print(res) # True
res = issubclass(Children, OldWoman)
print(res) # False
isinstance(应用在对象和类之间,判断类型)
“”“只要在一条继承链上即可(有血缘关系)”""
res = isinstance(obj, Children)
print(res) # True
res = isinstance(obj, Human)
print(res) # True
res = isinstance(obj, (Human, Children, Woman))
print(res) # True
res = isinstance(obj, OldWoman)
print(res) # False
四.__init__魔术方法(构造方法)
"""触发时机:实例化对象,初始化的时候触发功能:为对象添加成员参数:参数不固定,至少一个self参数返回值:无
"""
1.基本语法
class MyClass():def __init__(self):print("初始化方法被触发")# 为当前对象self 添加成员 nameself.name = "袁文志"# 实例化对象
obj = MyClass()
print(obj.name)
2.带有多个参数的构造方法
class MyClass():def __init__(self, name):# self.成员名 = 参数self.name = name
# 实例化对象
obj = MyClass("宋云杰") # 在实例化对象的时候,给构造方法传递参数
print(obj.name)
3.类可以是一个,对象可以是多个
“”“一个类可以实例化多个不同的对象,而对象和对象之间彼此独立,但都可以使用类中的公有的成员”""
class Children():def __init__(self, name, skin):self.name = nameself.skin = skindef cry(self):print("小孩一出生就哇哇哇的哭")def drink(self):print("小孩一出生就要喝奶奶")def __la(self):print("小孩拉粑粑是私有的")def pub_info(self):print("该对象的名字是{},该对象的肤色是{}".format(self.name, self.skin))
# 创建第一个小孩
afanda = Children("阿凡达", "蓝色的")
afanda.pub_info() # 该对象的名字是阿凡达,该对象的肤色是蓝色的
afanda.cry() # 小孩一出生就哇哇哇的哭# 创建第二个小孩
afanti = Children("阿凡提", "黄色的")
afanti.pub_info() # 该对象的名字是阿凡提,该对象的肤色是黄色的
afanti.drink() # 小孩一出生就要喝奶奶# 创建第三个小孩
bao = Children("我滴宝强", "绿色的")
bao.pub_info() # 该对象的名字是我滴宝强,该对象的肤色是绿色的
# bao.__la() # 无法在类外调用私有的成员
0804Python总结-单继承,多继承,菱形继承,__init__魔术方法(构造方法)相关推荐
- c/c++入门教程 - 2.4.6 继承、公共继承、保护继承、私有继承、virtual虚继承(概念、语法、方式、构造和析构顺序、同名成员处理、继承同名静态成员处理、多继承语法、菱形继承、钻石继承)
目录 4.6 继承 4.6.1 继承的基本语法 4.6.2 继承方式 4.6.3 继承中的对象模型 4.6.4 继承中构造和析构顺序 4.6.5 继承同名成员处理方式 4.6.6 继承同名静态成员处理 ...
- 虚继承:解决菱形继承问题
文章目录 一.菱形继承 二.菱形继承问题 三.虚继承:解决菱形继承问题 ```羊驼类继承的实际是两个虚基类指针 vbptr (virtual base pointer),``` 四.虚继承代码 一.菱 ...
- php 魔术方法 多继承,day23:单继承多继承菱形继承__init__魔术方法
原文:https://www.cnblogs.com/libolun/p/13434675.html 单继承 关于继承的一些基本概念 1.什么是子类?什么是父类?如果一个类继承另外一个类,该类叫做子类 ...
- c++中的继承--3(多继承问题,菱形继承)
继承中的多继承 #include<iostream>using namespace std;class Base1 { public:Base1(){m_A = 10;} public:i ...
- 类的继承,派生,组合,菱形继承,多态与多态性
类的继承 继承是一种新建类的方式,新建的类称为子类,被继承的类称为父类 继承的特性是:子类会遗传父类的属性 继承是类与类之间的关系 为什么用继承 使用继承可以减少代码的冗余 对象的继承 python中 ...
- 面向对象(继承,多态,单态,魔术方法)
# ### 继承 """ 一个类除了自身所拥有的属性方法之外,还获取了另外一个类的成员属性和方法 是一种继承关系 被继承的类叫做父类(基类,超类),继承的类叫做子类(衍生 ...
- python代码学习——类与对象提升(继承、超继承,类的例题,魔术方法)
python代码学习--类与对象提升 继承 继承的特殊属性: 代码示例 方法的重写和覆盖(overrrid) 总结 超继承 继承中的初始化 多继承 例题 类的魔术方法 哈希(hash)和eq方法 bo ...
- 菱形继承与菱形虚拟继承
菱形继承 单继承:一个子类只有一个直接父类时称这个继承关系为单继承 多继承:一个子类有两个或以上直接父类时称这个继承关系为多继承 菱形继承:菱形继承是多继承的一种特殊情况. 来看看下面这段菱形继承的代 ...
- C++反汇编第五讲,认识多重继承,菱形继承的内存结构,以及反汇编中的表现形式....
C++反汇编第五讲,认识多重继承,菱形继承的内存结构,以及反汇编中的表现形式. 目录: 1.多重继承在内存中的表现形式 多重继承在汇编中的表现形式 2.菱形继承 普通的菱形继承 虚继承 汇编中的表现形 ...
- 【C++】继承详解,菱形继承问题
继承体系 概念 继承方式 赋值兼容规则 同名隐藏 子类对象的构造过程 菱形继承 概念 是面向对象程序设计是代码可以复用的最重要的手段,它允许程序员在保持原有的类的特性的基础下进行拓展,增加功能. 这样 ...
最新文章
- robotframework的学习笔记(十二)------DatabaseLibrary 库
- synchronized能不能保证有序性??
- Tensorflow--Debug
- Java开源项目:Spring Integration
- 牛客题霸 [ 实现二叉树先序,中序和后序遍历]C++题解/答案
- js数组再倒数第二个添加元素_归纳JS中数组的使用(一)元素新增和删除
- git关闭密码自动存储_RobotFramework实战篇PC端web自动化demo及持续集成
- SAP打印出库单需求
- 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_1-4.在线教育后台数据库设计...
- 20200724每日一句
- deepin/ubuntu 惠普星14 锐龙版本 安装RTL8821CE 无线网卡驱动
- 地球轨道计算方法,开普勒三大定律的证明,补充-解析几何之椭圆
- 计算机高级培训教师感言,教师信息技术培训感言信息技术培训心得多篇.docx
- 银行计算机岗社会招聘考什么题目,2020各大银行科技岗招聘考试考试内容是什么?...
- 名片 - 名片设计的比例
- 5G wifi 和 5G通信
- 练习六(归并排序、第k小元素、棋盘覆盖、大整数乘法)
- 提权-Windows操作系统
- Java的基本特性和优势
- 当人说君子动口不动手时怎么回怼_俗话说:“君子动口不动手。”那么到底什么样的人才称得上君子?...
热门文章
- Java实现分数排名算法_海量用户积分排名算法探讨(转)
- GaRy-Liang的linux成长日记8-RAID阵列
- 中国海洋大学计算机系实习报告,中国海洋大学海洋学实习报告.doc
- HBuilder手机Iphone运行提示“未受信用的企业级开发者”
- 红帽linux挂载光盘_redhat挂载光盘 命令 - 卡饭网
- Scheme 编程语言(1)介绍
- PYTHON通过高德API实现城市地址与经纬度批量转换(每十个一组查询)
- linux 启动服务 sys,从磁盘启动的过程与SYSLINUX
- 织梦栏目地址使用栏目名称首字母
- ios13一直在估算剩余时间怎么办