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

  1. 通过一个列子认识父类和子类中,子类的如何实现对父类默认属性调用,同时拥有自己的属性,
    如何在子类中调用父类的方法,
    class Ainmal:
  2. country='afdas'
  3. def __init__(self,name,life_value,argg):
  4. self.name=name
  5. self.life_value=life_value
  6. self.argg=argg
  7. def eat(self):
  8. self.life_value+=10
  9. def equipment(self):
  10. self.argg+=50
  11. class Dog(Ainmal):
  12. def __init__(self,name,breed,lief_value,argg):#使用父类的属性,指名道姓用法
  13. self.breed=breed #派生属性,父类没有的属性
  14. #Ainmal.__init__(self,name,lief_value,argg)#这里的参数位置一定要和类的位置一样
  15. super().__init__(name,lief_value,argg) #新式类#这个方法和上边的方法一样,但是他是寻找最近的父类这个是
  16. def eat(self):#
  17. print('狗在吃屎') # 子类自己的方法
  18. Ainmal.eat(self)#放在这里可以执行就也可以同时执行父类的放法
  19. #super(Dog, self).eat()#与上一句的作用一样,也可以写成这种形式super().eat()
  20. def get_weapon(self):#派生方法:子类中有但是父类中没有的方法
  21. print('狗得到了武器,准备打人')
  22. sonbyy=Dog('太白','哈士奇',1000,50)
  23. print(sonbyy.eat)
  24. print(Ainmal.eat)
  25. print(sonbyy.life_value)
  26. sonbyy.eat()
  27. print(sonbyy.life_value)
  28. print(sonbyy.__dict__)
  29. #当子类父类都有eat方法的时候,想要调用某一个方法的时候
  30. sonbyy.eat()#狗在吃屎#调用子类的方法
  31.  
  32. Ainmal.eat(sonbyy) #调用父类的方法
  33. print(sonbyy.life_value)#
  34.  
  35. Ainmal.equipment(sonbyy)# 当父类中有的方法,子类没有但是想要调用,可以用此方法进行调用
  36. print(sonbyy.argg) #100 #可以看到对象sonbyy的攻击力增加了
  37.  

# 人类 狗类 相同的属性 提取了一个__init__方法,在这个方法里放一些共有的属性
# 猫类和狗类 相同的方法 直接把相同的方法提取出来,放在基类里

通过继承建立了派生类与基类之间的关系,它是一种'是'的关系,比如白马是马,人是动物。

当类之间有很多相同的功能,提取这些共同的功能做成基类,用继承比较好,比如教授是老师

钻石继承

继承顺序

  1. class D(object):
  2. def t1(self):
  3. print('D')
  4. class B(D):
  5. pass
  6. # def t1(self):
  7. # print('b')
  8. class C(D):
  9. pass
  10. # def t1(self):
  11. # print('C')
  12. class A(B,C):
  13. # def t1(self):
  14. # print('A')
  15. pass
  16. f1=A()
  17. f1.t1() #执行这个的时候,当对象中没有此方法的时候,会先去从父类B中去找有没有t1()方法,
  18. # 没有的话再去父类D中去找,如果还没有的话就去大父类中去找f1()这个方法,
  19. #这就是钻石继承的顺序
  20. print(A.mro())#新式类可以用此方法打印继承顺序如下
  21. #[<class '__main__.A'>, <class '__main__.B'>
  22. # , <class '__main__.C'>, <class '__main__.D'>, <class 'object'>]
  23.  
  24. #当大父类是class D(object):的新式类而不是class D:这种经典类类型
  25. #的时候,当执行

新式类的继承顺序,广度优先

新式类广度优先

经典类广度优先

继承原理

python到底是如何实现继承的,对于你定义的每一个类,python会计算出一个方法解析顺序(MRO)列表,这个MRO列表就是一个简单的所有基类的线性顺序列表,例如

  1. >>> F.mro() #等同于F.__mro__
  2. [<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. 提高代码可读性
  3. 规范编程模式

几个名词

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

抽象类与接口类

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

钻石继承

  1. 新式类:广度优先
  2. 经典类:深度优先

多态

  1. 多态 & 鸭子类型
  2. # 一种事物的多种形态
  3. # class Animal:pass
  4. # class Dog(Animal):pass
  5. # class Cat(Animal):pass

多态性

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

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

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

多态性

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

鸭子类型

逗比时刻:

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

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

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

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

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

  1. #二者都像鸭子,二者看起来都像文件,因而就可以当文件一样去用
  2. class TxtFile:
  3. def read(self):
  4. pass
  5.  
  6. def write(self):
  7. pass
  8.  
  9. class DiskFile:
  10. def read(self):
  11. pass
  12. def write(self):
  13. pass

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

day25 python学习 继承,钻石继承 多态的更多相关文章

  1. day25 python学习 继承,钻石继承

    通过一个列子认识父类和子类中,子类的如何实现对父类默认属性调用,同时拥有自己的属性,如何在子类中调用父类的方法,class Ainmal: country='afdas' def __init__(s ...

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

    原文地址 http://www.cnblogs.com/testview/p/4651198.html 1.   Python的继承以及调用父类成员 python子类调用父类成员有2种方法,分别是普通 ...

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

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

  4. python之路----钻石继承

    钻石继承 继承顺序 class A(object): def test(self): print('from A') class B(A): def test(self): print('from B ...

  5. (转载)深入super,看Python如何解决钻石继承难题

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

  6. Python学习之单继承与多继承

    继承 面向对象编程语言的一个主要功能就是“继承”. 继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展. (1) 单继承:python同时支持类的继承 ...

  7. python学习笔记14(多态、封装、继承)

    创建自已的对象(尤其是类型或者被称为类的对象)是python非常核心的概念. 多态: 可对不同类的对象使用同样的操作. 封装:对外部世界隐藏对象的工作细节. 继承:以普通的类为基础建立专门的类对象. ...

  8. python学习日记(继承和多态)

    继承 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类(Base class.S ...

  9. Python学习 Day 8 继承 多态 Type isinstance dir __slots__

    继承和多态 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类(Base clas ...

随机推荐

  1. English trip -- VC(情景课) 8 A Get ready

    Words cashier  # 收银员                a cashier counts money   收钱 custodian  # 清洁工     a custodian  cl ...

  2. codeforces 930b//Game with String// Codeforces Round #468 (Div. 1)

    题意:一个串,右循环移位后,告诉你第一个字母,还能告诉你一个,问你能确定移位后的串的概率. 用map记录每个字母出现的位置.对于每个字母,用arr[j][k]记录它的所有出现位置的后j位是字母k的个数 ...

  3. 删除php数组中的元素

    删除一个元素,且保持原有索引不变 使用 unset 函数,示例如下: <?php $array = array(0 => "a", 1 => "b&qu ...

  4. hdu6394Tree lct

    树上弹飞绵羊,现场树分块没写出来= = 先预处理倍增,新建一个n+1节点,能弹到就建一条边,然后每操作2就cut,然后link,1的答案就是x到n+1的距离, //#pragma GCC optimi ...

  5. HDU-1272 小希的迷宫 (并查集、判断图是否为树)

    Description 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就 ...

  6. pos提交提交数据时碰到Django csrf

    我的github(PS:希望star):https://github.com/thWinterSun/v-admin 最近在用Vue写前端代码,再用vue-resource向后台提交数据.项目后台是用 ...

  7. java并发编程:线程安全管理类--原子操作类--AtomicLongFieldUpdater<T>

    1.类 AtomicLongFieldUpdater<T> public abstract class AtomicLongFieldUpdater<T> extends Ob ...

  8. 对spring 对持久层的支持和数据库连接池的理解

    1.spring对持久层的支持在于,得到数据库连接之后操作上的封装,将操作简化了.也就是说以后操作sql语句就用XXXTemplate(就是一个工具类)对象了. 2.数据库连接池的作用只在于得到数据库 ...

  9. Hadoop序列化和反序列化

    1. 序列化从头说    在面向对象程序设计中,类是个很重要的概念.所谓“类”,可以将它想像成建筑图纸,而对象就是根据图纸盖的大楼.类,规定了对象的一切.根据建筑图纸造房子,盖出来的就是大楼,等同于将 ...

  10. 宿主环境(host environment)

    在此前的内容中,我讨论的都是JavaScript语言及其规范,而并非该语言的应用环境.在大多数人看来,JavaScript应用环境都是Web浏览器,这也的确是该语言最早的设计目标.然而从很早开始,Ja ...