day25 python学习 继承,钻石继承
- 通过一个列子认识父类和子类中,子类的如何实现对父类默认属性调用,同时拥有自己的属性,
如何在子类中调用父类的方法,
class Ainmal:- country='afdas'
- def __init__(self,name,life_value,argg):
- self.name=name
- self.life_value=life_value
- self.argg=argg
- def eat(self):
- self.life_value+=10
- def equipment(self):
- self.argg+=50
- class Dog(Ainmal):
- def __init__(self,name,breed,lief_value,argg):#使用父类的属性,指名道姓用法
- self.breed=breed #派生属性,父类没有的属性
- #Ainmal.__init__(self,name,lief_value,argg)#这里的参数位置一定要和类的位置一样
- super().__init__(name,lief_value,argg) #新式类#这个方法和上边的方法一样,但是他是寻找最近的父类这个是
- def eat(self):#
- print('狗在吃屎') # 子类自己的方法
- Ainmal.eat(self)#放在这里可以执行就也可以同时执行父类的放法
- #super(Dog, self).eat()#与上一句的作用一样,也可以写成这种形式super().eat()
- def get_weapon(self):#派生方法:子类中有但是父类中没有的方法
- print('狗得到了武器,准备打人')
- sonbyy=Dog('太白','哈士奇',1000,50)
- print(sonbyy.eat)
- print(Ainmal.eat)
- print(sonbyy.life_value)
- sonbyy.eat()
- print(sonbyy.life_value)
- print(sonbyy.__dict__)
- #当子类父类都有eat方法的时候,想要调用某一个方法的时候
- sonbyy.eat()#狗在吃屎#调用子类的方法
- Ainmal.eat(sonbyy) #调用父类的方法
- print(sonbyy.life_value)#
- Ainmal.equipment(sonbyy)# 当父类中有的方法,子类没有但是想要调用,可以用此方法进行调用
- print(sonbyy.argg) #100 #可以看到对象sonbyy的攻击力增加了
# 人类 狗类 相同的属性 提取了一个__init__方法,在这个方法里放一些共有的属性
# 猫类和狗类 相同的方法 直接把相同的方法提取出来,放在基类里
通过继承建立了派生类与基类之间的关系,它是一种'是'的关系,比如白马是马,人是动物。
当类之间有很多相同的功能,提取这些共同的功能做成基类,用继承比较好,比如教授是老师
钻石继承
继承顺序
- class D(object):
- def t1(self):
- print('D')
- class B(D):
- pass
- # def t1(self):
- # print('b')
- class C(D):
- pass
- # def t1(self):
- # print('C')
- class A(B,C):
- # def t1(self):
- # print('A')
- pass
- f1=A()
- f1.t1() #执行这个的时候,当对象中没有此方法的时候,会先去从父类B中去找有没有t1()方法,
- # 没有的话再去父类D中去找,如果还没有的话就去大父类中去找f1()这个方法,
- #这就是钻石继承的顺序
- print(A.mro())#新式类可以用此方法打印继承顺序如下
- #[<class '__main__.A'>, <class '__main__.B'>
- # , <class '__main__.C'>, <class '__main__.D'>, <class 'object'>]
- #当大父类是class D(object):的新式类而不是class D:这种经典类类型
- #的时候,当执行
新式类的继承顺序,广度优先
新式类广度优先
经典类广度优先
继承原理
python到底是如何实现继承的,对于你定义的每一个类,python会计算出一个方法解析顺序(MRO)列表,这个MRO列表就是一个简单的所有基类的线性顺序列表,例如
- >>> F.mro() #等同于F.__mro__
- [<class '__main__.F'>, <class '__main__.D'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]
为了实现继承,python会在MRO列表上从左到右开始查找基类,直到找到第一个匹配这个属性的类为止。
而这个MRO列表的构造是通过一个C3线性化算法来实现的。我们不去深究这个算法的数学原理,它实际上就是合并所有父类的MRO列表并遵循如下三条准则:
1.子类会先于父类被检查
2.多个父类会根据它们在列表中的顺序被检查
3.如果对下一个类存在两个合法的选择,选择第一个父类
继承小结
继承的作用
- 减少代码的重用
- 提高代码可读性
- 规范编程模式
几个名词
- 抽象:抽象即抽取类似或者说比较像的部分。是一个从具题到抽象的过程。
- 继承:子类继承了父类的方法和属性
- 派生:子类在父类方法和属性的基础上产生了新的方法和属性
抽象类与接口类
- 1.多继承问题
- 在继承抽象类的过程中,我们应该尽量避免多继承;
- 而在继承接口的时候,我们反而鼓励你来多继承接口
- 2.方法的实现
- 在抽象类中,我们可以对一些抽象方法做出基础实现;
- 而在接口类中,任何方法都只是一种规范,具体的功能需要子类实现

钻石继承
- 新式类:广度优先
- 经典类:深度优先
day25 python学习 继承,钻石继承的更多相关文章
- day25 python学习 继承,钻石继承 多态
---恢复内容开始--- 通过一个列子认识父类和子类中,子类的如何实现对父类默认属性调用,同时拥有自己的属性,如何在子类中调用父类的方法,class Ainmal: country='afdas' d ...
- 深入super,看Python如何解决钻石继承难题 【转】
原文地址 http://www.cnblogs.com/testview/p/4651198.html 1. Python的继承以及调用父类成员 python子类调用父类成员有2种方法,分别是普通 ...
- 深入super,看Python如何解决钻石继承难题
1. Python的继承以及调用父类成员 python子类调用父类成员有2种方法,分别是普通方法和super方法 假设Base是基类 class Base(object): def __init_ ...
- python之路----钻石继承
钻石继承 继承顺序 class A(object): def test(self): print('from A') class B(A): def test(self): print('from B ...
- (转载)深入super,看Python如何解决钻石继承难题
1. Python的继承以及调用父类成员 python子类调用父类成员有2种方法,分别是普通方法和super方法 假设Base是基类 class Base(object): def __init_ ...
- Python学习之单继承与多继承
继承 面向对象编程语言的一个主要功能就是“继承”. 继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展. (1) 单继承:python同时支持类的继承 ...
- python学习日记(继承和多态)
继承 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类(Base class.S ...
- Python学习 Day 8 继承 多态 Type isinstance dir __slots__
继承和多态 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类(Base clas ...
- Python学习---django模板继承180123
django模板继承 --20180123 a.include 模板标签 b.extend(继承)模板标签 ------include 模板标签 该标签允许在(模板中)包含其它的模板的内容. 标签的 ...
随机推荐
- English trip -- VC(情景课)5 B Places around town 城市设施
Vocabulary focus 核心词汇 drugstore 药店: pill n. 药丸:弹丸,子弹:口服避孕药 medicine n. 药:医学:内科:巫术 hos ...
- 大年三十。让字母在屏幕上奔跑:(sleep , system"clear")
system "clear",ruby清屏(osk系统上,window上用system "cls"). https://stackoverflow.com/qu ...
- android--------阿里 Sophix移动热修复
移动热修复(Mobile Hotfix)是阿里云提供的全平台App热修复服务方案.产品基于阿里巴巴首创hotpatch技术,提供最细粒度热修复能力,让您无需等待实时修复应用线上问题. 移动热修复提供的 ...
- EBS Workflow参考资料
参考资料: How to send an email from oracle workflow process using an AdHocRole? Notification System APIs ...
- splunk 通过rest http导入数据
使用 HTTP Event Collector go to Settings > Data inputs > HTTP Event Collector. Then click the Gl ...
- Logger.getLogger()和LogFactory.getLog()的区别
第一.Logger.getLogger()和LogFactory.getLog()的区别 1.Logger.getLogger()是使用log4j的方式记录日志: 2.LogFactory.getLo ...
- ECC算法整理纪要
初始ECC算法 1.用户A 密钥生成 (1):用随机数发生器产生随机数k∈[1,n-1]: (2):计算椭圆曲线点PA=[k]G,为公钥,k为用户A私钥: 2. 用户B加密算法及流程 设需要发送的消息 ...
- Flash Player离线安装包下载指南
在机房里装软件,没网是正常现象,有些老师要装Firefox/Chrome浏览器要有Flash,网上搜来搜去都是在线安装包一日在V2EX闲逛时发现了一位大神给出了Flash的离线安装包下载方式,在此立个 ...
- Mysql Innodb 表碎片整理
一.为什么会产生碎片 简单的说,删除数据必然会在数据文件中造成不连续的空白空间,而当插入数据时,这些空白空间则会被利用起来.于是造成了数据的存储位置不连续,以及物理存储顺序与理论上的排序顺序不同,这种 ...
- C语言atoi函数(将字符串转化为int)
头文件:#include <stdlib.h> atoi() 函数用来将字符串转换成整数(int),其原型为:int atoi (const char * str); [函数说明]atoi ...