一. 初识继承

  继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类.

  当我们在定义多个类的时候,发现要用到相同的方法或变量,如果每个类都要写相同的方法和变量,那么代码就会重复,为了减少代码,可以用继承来解决.

  1. # 三个类中都有相同的参数,造成代码重复
  2.  
  3. class Person:
  4. def __init__(self,name,sex,age):
  5. self.name = name
  6. self.sex = sex
  7. self.age = age
  8.  
  9. class Cat:
  10. def __init__(self,name,sex,age):
  11. self.name = name
  12. self.sex = sex
  13. self.age = age
  14.  
  15. class Dog:
  16. def __init__(self,name,sex,age):
  17. self.name = name
  18. self.sex = sex
  19. self.age = age

  用继承的思想来做

  1. class Animal:
  2. animal = '动物'
  3. def __init__(self, name, sex, age):
  4. self.name = name
  5. self.sex = sex
  6. self.age = age
  7.  
  8. def hobby(self):
  9. print('%s喜欢吃' % self.name)
  10.  
  11. class Person(Animal): #继承Animal类
  12. pass
  13. class Cat(Animal):
  14. pass
  15. class Dog(Animal):
  16. pass
  17.  
  18. print(Person.animal) #动物 类名可以访问父类所有内容
  19. p = Person('jack', '男', 25)
  20. p.hobby() #jack喜欢吃
  21. # 子类以及子类实例化的对象 可以访问父类的任何方法或变量.先从本类中找hobby方法,找不到则从父类里找
  1. 既要执行子类的方法,又要执行父类的方法? 有两种解决方法.
    1,Animal.__init__(self, name, sex, age)
    2,super().__init__(name,sex,age)
  1. class Animal:
  2. def __init__(self, name, sex, age):
  3. self.name = name
  4. self.sex = sex
  5. self.age = age
  6.  
  7. def eat(self):
  8. print('%s会吃' % self.name)
  9.  
  10. def drink(self):
  11. print('%s会喝' % self.name)
  12.  
  13. class Bird(Animal):
  14. def __init__(self, name, sex, age, wing):
  15. # super().__init__(name, sex, age ) #自动把self传给父类
  16. Animal.__init__(self, name, sex, age)
  17. self.wing = wing
  18.  
  19. def egg(self):
  20. print('鸡会下蛋')
  21.  
  22. def eat(self): #本类含有和弗雷相同的方法名
  23. super().drink() #用super()调用父类的方法
  24. print('鸟会吃虫子')
  25.  
  26. b = Bird('鸟', '公', 30, '翅膀')
  27. print(b.__dict__) # {'name': '鸟', 'sex': '公', 'age': 30, 'wing': '翅膀'}
  28. b.eat()
  29. # 鸟会喝 #执行父类的eat方法
  30. # 鸟会吃虫子 #执行本类的eat方法

二. 继承的进

1. 单继承和多继承

  1. class A:
  2. pass
  3. class B(A): #单继承
  4. pass
  5. class C(A):
  6. pass
  7. class D(B,C): #多继承
  8. pass

2. 经典类, 新式类 

  新式类: 凡是继承object类都是新式类. python3x 所有的类都是新式类,因为python3x中的类都默认继承object.

  经典类: 不继承object类都是经典类, python2x:(既有新式类,又有经典类) 所有的类默认都不继承object类,所有的类默认都是经典类.你可以让其继承      object.

  1. 单继承: 新式类,经典类查询顺序一样.
  1. 多继承继承顺序(讨论的是继承两个类):
    新式类: 遵循广度优先 : 一条路走到倒数第二级,判断,如果其他路能走到终点,则返回走另一条路.如果不能,则走到终点. 可以用mro()来查询继承顺序.
  1. 经典类: 遵循深度优先 : 一条路走到底.
  1. class A:
  2. def func(self):
  3. print('IN A')
  4.  
  5. class B(A):
  6. # pass
  7. def func(self):
  8. print('IN B')
  9.  
  10. class C(A):
  11. # pass
  12. def func(self):
  13. print('IN C')
  14.  
  15. class D(B):
  16. # pass
  17. def func(self):
  18. print('IN D')
  19.  
  20. class E(C):
  21. def func(self):
  22. print('IN E')
  23.  
  24. class F(D,E):
  25. # pass
  26. def func(self):
  27. print('IN F')
  28.  
  29. f1 = F()
  30. f1.func() #IN F
  31.  
  32. print(F.mro()) # 查询类的继承顺序
  33. # [<class '__main__.F'>, <class '__main__.D'>, <class '__main__.B'>, <class '__main__.E'>,
  34. # <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]

3. 多继承原理: MRO_C算法

  1.  mro(): 查询类的继承顺序. 代码和步骤如下:
  1. class H:
  2. pass
  3.  
  4. class G(H):
  5. pass
  6.  
  7. class F(H):
  8. pass
  9.  
  10. class E(G):
  11. pass
  12.  
  13. class D(F):
  14. pass
  15.  
  16. class C(E):
  17. pass
  18.  
  19. class B(D):
  20. pass
  21.  
  22. class A(B, C, D):
  23. pass
  24.  
  25. print(A.mro())
  26.  
  27. '''
  28. 首先找到A继承的三个类的深度继承顺序,放到一个列表中
  29.  
  30. B [B,D,F,H]
  31. C [C,E,G,H]
  32. D [D,F,H]
  33.  
  34. 每个列表的第一个元素为头部,其它位置元素都为尾部,从第一个列表的头部开始找,找其他列表中尾部是否含有
  35. 这个类名,如果没有,提取出来放到一个列表中,如果有,找下一个列表的头部,循环下去
  36. 只要提取来一个,我们就从第一个列表的头部接着重复上面的操作.
  37.  
  38. A [A][B,D,F,H] [C,E,G,H] [D,F,H] [B,C,D] A #找到第一个列表的头A,其他列表尾部没有A,把A取出来,如果其他列表的头部有A则剔除
  39. [][B,D,F,H] [C,E,G,H] [D,F,H] [B,C,D] B
  40. [][D,F,H] [C,E,G,H] [D,F,H] [C,D] C
  41. [][D,F,H] [E,G,H] [D,F,H] [D] D
  42. [][F,H] [E,G,H] [F,H] [] F
  43. [][H] [E,G,H] [H] [] E #找到第一个列表的头部H,但是其他列表尾部有H,所以跳过这个列表,去下一个列表取头部
  44. [][H] [G,H] [H] [] G
  45. [][H] [H] [H] [] H
  46. [][] [] [] []
  47. lst = [A,B,C,D,F,E,G,H]
  48. '''
  1.  
  1. class F:
  2. pass
  3.  
  4. class E:
  5. pass
  6.  
  7. class D:
  8. pass
  9.  
  10. class C(D, F):
  11. pass
  12.  
  13. class B(E, D):
  14. pass
  15.  
  16. class A(B, C):
  17. pass
  18.  
  19. print(A.mro())
  20. '''
  21. 首先找到A继承的两个类的深度继承顺序
  22. 把B作为子类,找出B类的查询顺序
  23.  
  24. B [B] [E] [D] [E,D] B
  25. [] [E] [D] [E,D] E
  26. [] [] [D] [D] D
  27. [] [] [] []
  28. lst = [B,E,D]
  29. 把C作为子类,找出C类的查询顺序
  30.  
  31. C [C] [D] [F] [D,F] C
  32. [] [D] [F] [D,F] D
  33. [] [] [F] [F] F
  34. [] [] [] []
  35. lst = [C,D,F]
  36.  
  37. A [A] [B,E,D] [C,D,F] [B,C] A
  38. [] [B,E,D] [C,D,F] [B,C] B
  39. [] [E,D] [C,D,F] [C] E
  40. [] [D] [C,D,F] [C] C
  41. [] [D] [D,F] [] D
  42. [] [] [F] [] F
  43. [] [] [] []
  44. lSt = [A,B,E,C,D,F]
  45. '''
  1.  
  1.  
  1.  
  1.  
  1.  

python面向对象 : 继承的更多相关文章

  1. python 面向对象 继承 派生 组合

    具体参考博客:http://www.cnblogs.com/linhaifeng/articles/6182264.html#_label12 一.面向对象 面向对象:对象与对象之间的相互交互,不可预 ...

  2. Python面向对象-继承和多态特性

    继承 在面向对象的程序设计中,当我们定义一个class时候,可以从现有的class继承,新的class成为子类,被继承的class称为基类,父类或超类. 比如,编写一个名为Animal的class: ...

  3. Python面向对象继承案例

    面向对象三大特性 封装 根据 职责 将 属性 和 方法 封装 到一个抽象的 类 中 继承 实现代码的重用,相同的代码不需要重复的编写 多态 不同的对象调用相同的方法,产生不同的执行结果,增加代码的灵活 ...

  4. Python 面向对象--继承,实现,依赖,关联,聚合,组合

    一. 继承 继承指的是子类继承父类除私有内容以外的其他所有内容, 并且子类具有增加自己新内容的能力. 举例说明: class Animal: print("吃是动物的本能") cl ...

  5. Python面向对象 -- 继承和多态、获取对象信息、实例属性和类属性

    继承和多态 继承的好处: 1,子类可以使用父类的全部功能 2,多态:当子类和父类都存在相同的方法时,子类的方法会覆盖父类的方法,即调用时会调用子类的方法.这就是继承的另一个好处:多态. 多态: 调用方 ...

  6. Python面向对象----继承, 重载

    1. 面向对象三大特性之继承. 继承的便捷是子类可以直接调用父类里面的方法和属性.(在强类型语言里面是只能调用公有成员), 不用重复的造轮子. 减少程序猿的负担.实现多态等上层结构 2. 父类代码 3 ...

  7. python 面向对象 继承

    什么是继承 继承表达的是一种”是“的关系,比如人是动物 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类 继承是基于抽象的结 ...

  8. python面向对象继承

    class A(object):pass # 括号中可称为父类,基类,超类 class B:pass # 父类,基类,超类 class A_son(A,B):pass # 子类,派生类 class A ...

  9. 028.Python面向对象继承(单继承,多继承,super,菱形继承)

    一 继承的概念 种类 单继承 多继承 至少两个类: 子类:一个类继承另外一个类,那么该类是子类(也叫作衍生类) 父类:另外一个,这个被继承的类,叫做父类(也叫作超类),object 在python中 ...

随机推荐

  1. 前端开发利器: Bootstrap + AngularJS

    http://blog.csdn.net/conquer0715/article/details/51181391 概述 在HTML5盛行的互联网时代,涌现诸多的前端html/css/js框架,基于其 ...

  2. terraform 几个方便的工具

    几个方便的terraform 工具,方便了解terraform terraform-docs 方便的查看资源的信息(支持markdown,json 格式),对于ci/cd 很方便 项目地址 https ...

  3. unity3d常用组件及分析

  4. HTTP请求属性说明

    1)URL:页面地址. 2)Method :页面的提交方式,POST或GET. 3)EncType:编码类型.此参数给出一个内容类型(Content-Type),指定其做为回放脚本时“Content- ...

  5. [转]linux中vim命令

    在vi中按u可以撤销一次操作 u      撤销上一步的操作 ctrl+r 恢复上一步被撤销的操作 在vi中移动光标至: 行首:^或0 行尾:$ 页首:1G(或gg) 页尾:G(即shift+g) 显 ...

  6. 基于MVC4+EasyUI的Web开发框架形成之旅(4)--附件上传组件uploadify的使用

    大概一年前,我还在用Asp.NET开发一些行业管理系统的时候,就曾经使用这个组件作为文件的上传操作,在随笔<Web开发中的文件上传组件uploadify的使用>中可以看到,Asp.NET中 ...

  7. Hadoop的单机模式、伪分布式模式和完全分布式模式

    1.单机(非分布式)模式 这种模式在一台单机上运行,没有分布式文件系统,而是直接读写本地操作系统的文件系统. 2.伪分布式运行模式 这种模式也是在一台单机上运行,但用不同的Java进程模仿分布式运行中 ...

  8. PHP 解压 ZIP 文件到指定文件夹

    本类实现参考 php manual 评论 [php] view plain copy /** * function: 解压zip 格式的文件 * author:friker * date:2015-1 ...

  9. SDI工程时钟路径分析

    SDI工程时钟路径分析 //------------- Receive Ports - RX Fabric Output Control Ports ------------- output rxou ...

  10. Set up an SSH key with Sourcetree on macOS

    1. 打开 sourcetree,进入设置-账户: 2. 选择添加账户,托管主机选择 Bitbucket(或Github),再连接账号,登录已有的 Bitbucket 账号(或 Github 账号), ...