---恢复内容开始---

通过一个列子认识父类和子类中,子类的如何实现对父类默认属性调用,同时拥有自己的属性,如何在子类中调用父类的方法,class Ainmal:country='afdas'def __init__(self,name,life_value,argg):self.name=nameself.life_value=life_valueself.argg=arggdef eat(self):self.life_value+=10def 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)#1030

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.如果对下一个类存在两个合法的选择,选择第一个父类

继承小结

在python2.n的版本中有经典类(class  A:)和            新式类  class A(objiect)   这两种,   区别在于是否是继承objiect

而在Python3.n中,全是新式类(class A:)    不写objiect也是继承objiect       所以在继承关系上全是广度优先

# 在多继承中,super不只是寻找当前类的父类,而是依据mro顺序,
# 从A节点出发,根据广度优先排序查找下一个类

继承的作用

减少代码的重用
提高代码可读性
规范编程模式

几个名词

抽象:抽象即抽取类似或者说比较像的部分。是一个从具题到抽象的过程。
继承:子类继承了父类的方法和属性
派生:子类在父类方法和属性的基础上产生了新的方法和属性

抽象类与接口类

还未讲呢
1.多继承问题
在继承抽象类的过程中,我们应该尽量避免多继承;
而在继承接口的时候,我们反而鼓励你来多继承接口2.方法的实现
在抽象类中,我们可以对一些抽象方法做出基础实现;
而在接口类中,任何方法都只是一种规范,具体的功能需要子类实现

钻石继承

新式类:广度优先
经典类:深度优先

多态

多态 & 鸭子类型
# 一种事物的多种形态
# class Animal:pass
# class Dog(Animal):pass
# class Cat(Animal):pass

多态性

一 什么是多态动态绑定(在继承的背景下使用时,有时也称为多态性)

多态性是指在不考虑实例类型的情况下使用实例

在面向对象方法中一般是这样表述多态性:
向不同的对象发送同一条消息(!!!obj.func():是调用了obj的方法func,又称为向obj发送了一条消息func),不同的对象在接收时会产生不同的行为(即方法)。
也就是说,每个对象可以用自己的方式去响应共同的消息。所谓消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的函数。比如:老师.下课铃响了(),学生.下课铃响了(),老师执行的是下班操作,学生执行的是放学操作,虽然二者消息一样,但是执行的效果不同

多态性

peo=People()
dog=Dog()
pig=Pig()#peo、dog、pig都是动物,只要是动物肯定有talk方法
#于是我们可以不用考虑它们三者的具体是什么类型,而直接使用
peo.talk()
dog.talk()
pig.talk()#更进一步,我们可以定义一个统一的接口来使用
def func(obj):obj.talk()

鸭子类型

逗比时刻:

  Python崇尚鸭子类型,即‘如果看起来像、叫声像而且走起路来像鸭子,那么它就是鸭子’

python程序员通常根据这种行为来编写程序。例如,如果想编写现有对象的自定义版本,可以继承该对象

也可以创建一个外观和行为像,但与它无任何关系的全新对象,后者通常用于保存程序组件的松耦合度。

例1:利用标准库中定义的各种‘与文件类似’的对象,尽管这些对象的工作方式像文件,但他们没有继承内置文件对象的方法

例2:序列类型有多种形态:字符串,列表,元组,但他们直接没有直接的继承关系

#二者都像鸭子,二者看起来都像文件,因而就可以当文件一样去用
class TxtFile:def read(self):passdef write(self):passclass DiskFile:def read(self):passdef write(self):pass

---恢复内容结束---

转载于:https://www.cnblogs.com/wangkun122/p/7879795.html

day25 python学习 继承,钻石继承 多态相关推荐

  1. 利用python画钻石_python多继承(钻石继承)问题和解决方法简单示例

    本文实例讲述了python多继承(钻石继承)问题和解决方法.分享给大家供大家参考,具体如下: 在菱形多继承中,如果用父类.__init__()来调用父类的初始化方法,最上层会执行两次,所以遇到这种情况 ...

  2. 深入super,看Python如何解决钻石继承难题

    1.   Python的继承以及调用父类成员 python子类调用父类成员有2种方法,分别是普通方法和super方法 假设Base是基类 class Base(object):def __init__ ...

  3. Python super(钻石继承)

    1.   Python的继承以及调用父类成员 python子类调用父类成员有2种方法,分别是普通方法和super方法 假设Base是基类 class Base(object):def __init__ ...

  4. python学习之路-继承

    上次写的面向对象的基础知识, 这一节继续面向对象(OOP)继承篇. 面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过 继承 机制.继 承完全可以理解成类之间的 类型和子类型 ...

  5. python学习之类class继承、super()使用和__init__初始化

    类的学习.__init__学习和super方法学习 1.python中类的属性.方法学习 2. 类的实例方法.类方法.静态方法 3.类class的访问控制:单划线_与双划线__ 4.继承中的__ini ...

  6. Python学习-类的继承

    1 继承: 2 #python2 经典类是按深度优先来继承的,新式类是按广度优先来继承的 3 #python3 经典类和新式类都是按广度优先来继承的 4 5 6 7 #经典类:class People ...

  7. Python学习之路:多态实例

    多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作.简单的说,就是一句话:允许将子类类型 ...

  8. python学习day24 继承 派生

    继承 class A(object):pass # 父类,基类,超类 object是类祖宗,一般默认不写 class B:pass # 父类,基类,超类 class A_son(A,B):pass # ...

  9. Python学习 - 面向对象之多态

    Python学习 - 语法入门:https://blog.csdn.net/wanzijy/article/details/125287855 Python学习 - 数据类型:https://blog ...

最新文章

  1. python使用matplotlib可视化线图(line plot)、使用invert_yaxis函数将Y轴坐标反序(invert the y axis in matplotlib)
  2. Java Web 三大框架开发资料
  3. 初试Windows 8 RTM
  4. 【NLP】ACL 2010-2020研究趋势总结
  5. 计算机科学与技术行业需求,计算机科学与技术专业需求分析和发展方向
  6. 贪心 - 划分字母区间
  7. 填补服务机器人市场空白,九号机器人提供智能服务场景解决方案!
  8. linux find 拷贝,通过find命令寻找文件并拷贝到一个指定目录方法详解
  9. 仿码支付全新免签支付系统源码
  10. oracle分区唯一索引,关于分区表与唯一索引的测试记录
  11. 【雕虫小技第8篇】scratch编程技巧之源码中的图片素材资源导出!
  12. 移动端车牌识别SDK应用
  13. spyder pyecharts不显示_飞利浦292E2E评测丨宽屏显示器中的多面手
  14. Python文件指针
  15. 【计算机网络】数据链路层 : ALOHA 协议 ( 纯 ALOHA 协议 | 时隙 ALOHA 协议 )
  16. 存储卡规格等级全解!SD卡TF卡都能用
  17. rust语言和cargo介绍
  18. 李沐动手学深度学习V2-基于注意力机制的seq2seq
  19. 基于内容可变长度分块Content Defined Chunking
  20. 一个点的经度和纬度,以这个点为圆心,1000米为半径,最大的经度和纬度,最小的经度和纬度...

热门文章

  1. 前端饿了吗框架的学习(element)
  2. 铅酸蓄电池单格最高与最低电压
  3. 狂暴者 pat basic 练习二十七 打印沙漏
  4. python通过手机给电脑发送消息_教你如何使用Python向手机发送通知
  5. Z-File 开源免费自建个人网盘程序 Java/支持云存储
  6. Python字典(dict)详解
  7. POJ 2524 宗教信仰 并查集 基础模板
  8. java visitor_Java Visitor Pattern(访问者模式)
  9. 「Plant Biotechnol J」花生单细胞测序鉴定叶片发育关键转录因子
  10. 产品经理经常遇到的诸多问题(一)