继承

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

  在python3.x版本中,所有的类都默认继承object类。

1.继承与重用

  首先,我们来看看一个例子:

# 猫类:吃喝睡,爬树
# 狗类:吃喝睡,看家#一。通过之前对面向对象的学习,我们可以轻易的定义出这两个类来:
class Cat:def __init__(self,name,kind,food):self.name = nameself.kind = kindself.food = fooddef eat(self):print('%s吃%s'%(self.name,self.food))def drink(self):print('%s喝水'%self.name)def sleep(self):print('%s在睡觉'%self.name)def climb(self):print('%s在爬树'%self.name)class Dog:def __init__(self,name,kind,food):self.name = nameself.kind = kindself.food = fooddef eat(self):print('%s吃%s'%(self.name,self.food))def drink(self):print('%s喝水'%self.name)def sleep(self):print('%s在睡觉'%self.name)def look_after_home(self):print('%s在看家'%self.name)

  但是再往深入探讨,我们会发现其实编写的猫类和狗类代码中,很多都冗余代码。有什么方式能够把重复的代码提取出来吗?当然有,这时候就可以用到继承的思想,父类中的所有属性和方法都可以被子类使用。

#二。把冗余的代码提出来,抽象出一个宠物类,让猫类和狗类都继承这个宠物类。
class Pet:def __init__(self,name,kind,food):self.name = nameself.kind = kindself.food = fooddef eat(self):print('%s吃%s'%(self.name,self.food))def drink(self):print('%s喝水'%self.name)def sleep(self):print('%s在睡觉'%self.name)class Cat(Pet):def climb(self):print('%s在爬树'%self.name)class Dog(Pet):def kanjia(self):print('%s在看家'%self.name)tom = Cat('Tom','暹罗猫','猫粮')   #子类使用名字(静态变量和方法),如果在子类中没有,就使用父类的
hei = Dog('小黑','二哈','狗粮')tom.climb()
hei.kanjia()

2.继承与派生

  子类也可以定义自己特有的属性或者重新这些属性(但并不会影响到父类),一旦定义了自己的属性且与父类同名时,这种属性称为派生属性。子类的对象调用这个属性时,会直接选择子类中的。

class Pet:def __init__(self,name,kind,food):print('IN PET')self.name = nameself.kind = kindself.food = fooddef eat(self):print('%s吃%s'%(self.name,self.food))def drink(self):print('%s喝水'%self.name)def sleep(self):print('%s在睡觉'%self.name)class Cat(Pet):def __init__(self,name,kind,food,eye_color):print('IN CAT')self.eye_color = eye_color   #派生属性# Pet.__init__(name,kind,food)super().__init__(name,kind,food)  #super方法,可以省去selfdef climb(self):print('%s在爬树'%self.name)class Dog(Pet):def kanjia(self):print('%s在看家'%self.name)tom = Cat('阿猫','橘猫','猫粮','绿色')
print(tom.eye_color)

# 派生经典考题:
class Foo:def __init__(self):self.func()def func(self):print('in tho foo')class Son(Foo):def func(self):print('in the son')s1 = Son()
>>>
in the son################
当self去调用某个方法的时候,不要看self在哪里,而是要明确self代表的到底是谁。

  派生总结:

  1.当子类中方法要被调用的时候,子类的对象会直接选择子类中的方法。

  2.父类的方法不会被自动执行。

  3.如果我们既要执行子类的方法又要执行父类中的方法,那么需要在子类的方法中调用父类的方法,有以下两种方法:

  (1)父类名.方法名(self,参数...)

  (2)super().方法名(参数...)   #关于super的查找顺序,请继续往下看。

3.抽象类

  抽象类在python中使用的不是特别多,但是在以后的工作中,公司有可能会使用抽象类来制定开发的规则,在以后看源码的过程中,也可能会碰到抽象类的概念。试想一个场景:在今后的多人开发,功能复杂,许多后期拓展功能的项目中,代码的规范变得尤其的重要,而此时,抽象类就能够起到一个很好的模板作用。

  抽象类只是一个模板的规范,基本不会实现什么功能,所以抽象类是不可以被实例化的。

#定义抽象类,需要引入一个模块。from abc import ABCMeta,abstractmethod
class Payment(metaclass=ABCMeta):       #抽象类必须继承一个叫ABCMeta的类@abstractmethod                     #抽象类规定的方法,用abstractmethod装饰器装饰,规定了def pay(self):pass                   后面凡是继承该抽象类的子类都必须有一个同名的方法。class Alipay(Payment):def pay(self,money):print('使用支付宝支付了%s元'%money)

4.多继承

  在python中允许一个子类是可以继承多个父类的。

class ParentClass1:  #定义父类1passclass ParentClass2:  #定义父类2passclass ChildClass(ParentClass1):   #定义子类(继承父类1) 单继承passclass ChildClass2(ParentClass1,ParentClass2):  #多继承pass

  “__base__”:显示子类的一个父类。

  “__bases__”:显示子类的所有父类。

5.新式类与经典类

  python3.x所有的类都是新式类,所有的新式类都有一个默认继承的父类,叫做object类。

  python2.7中经典类和新式类并存。

    class Student:Pass   #经典类

    class Student(object):pass  #新式类

  总结:

  (1)继承了object的类都是新式类。

  (2)在py3中所有的类都是新式类。

  (3)在py2中既有新式类也有经典类。

  一.多继承的顺序/新式类和经典类之间的区别?

 (1)钻石继承:广度优先。

  新式类的所有多继承关系寻找方法的顺序--->遵循广度优先。

  mro()--->显示多继承的继承顺序。

  super()--->super方法不是单纯的寻找父类,在多继承中,是遵循mro循序的。

class A:def func(self):print('A')class B(A):def func(self):super().func()print('B')class C(A):def func(self):super().func()print('C')class D(B,C):def func(self):super().func()print('D')d = D()
d.func()
print(D.mro())              #新式类遵循广度优先。
>>>
A
C
B
D
[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]

  

 总结:

  新式类在多继承时,遵循广度优先。

  经典类在多继承时,遵循深度优先。

  

转载于:https://www.cnblogs.com/hebbhao/p/9549579.html

DAY18 面向对象三大特性之继承相关推荐

  1. 大数据必学Java基础(四十):面向对象三大特性之一继承(Inheritance)

    文章目录 面向对象三大特性之一继承(Inheritance) 一.列举案例说明 1.类是对对象的抽象

  2. java 面向对象三大特性之继承 万字详解(超详细)

    目录 前言 : 一.为什么需要继承: 二.什么是继承(Warning : 篇幅较长)? 1.继承概述: 2.子类继承父类之后达到的效果 : ①如何使用继承? ②代码演示 : 3.继承的使用场景: eg ...

  3. C++——面向对象三大特性之继承

    文章目录 继承概念 继承的定义 继承的语法格式 继承方式 继承方式的汇总 赋值兼容规则 基类对象和派生类对象的赋值转换 继承中的作用域 派生类的默认成员函数 继承与友元 继承与静态成员 菱形继承 虚继 ...

  4. 面向对象三大特性(继承)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.今日回顾 1.<高等数学>:一节网课 2.阅读:<费马大定理>300页 3.英语:120个 ...

  5. 深入理解Java面向对象三大特性 封装 继承 多态

    1.封装 封装的定义: 首先是抽象,把事物抽象成一个类,其次才是封装,将事物拥有的属性和动作隐藏起来,只保留特定的方法与外界联系 为什么需要封装: 封装符合面向对象设计原则的第一条:单一性原则,一个类 ...

  6. Java面向对象三大特性(封装继承多态)解释及案例

    文章目录 包 包基本语法 命名规则 命名规范 导入包实例 访问修饰符 面向对象编程-封装 面向对象编程-继承 super关键词 super和this的比较 方法重写/覆盖 (override) 注意事 ...

  7. python基础学习十四:面向对象三大特性之继承

    一.继承的基本概念 Python面向对象的继承指的是多个类之间的所属关系,即子类默认继承父类的所有属性和方法,具体如下: # ⽗类A class A(object):def __init__(self ...

  8. Day21 面向对象三大特性之继承

    1.初识继承 什么是继承 继承是面向对象中的一个概念,是描述两个对象的关系,在程序中,继承描述的是类和类之间的关系 例如:a继承了b,a就可以使用b的属性和方法.a称之为子类,b称之为父类,也叫基类 ...

  9. python面向对象三大特性之继承

    继承是创建新类的方法,以下是几个概念 父类,基类,超类: 被继承的类 子类,派生类:继承而产出的类 单继承:继承一个父类 多继承:继承多个父类 继承: 什么是什么的关系 父类中没有的属性,在字类中出现 ...

  10. python继承的特点_python面向对象三大特性之继承

    继承是创建新类的方法,以下是几个概念 父类,基类,超类: 被继承的类 子类,派生类:继承而产出的类 单继承:继承一个父类 多继承:继承多个父类 继承: 什么是什么的关系 父类中没有的属性,在字类中出现 ...

最新文章

  1. Java类加载机制:双亲委托模型
  2. do msgbox loop_【连载1】DDC模块 DO点与强电电气柜的接口形式
  3. MDT跨网段UEFI部署系统
  4. 记录F1分数和召回率
  5. python在办公上的应用_python自动化办公:玩转word之样式秘笈
  6. 被江苏网警点名后 咪蒙发道歉信:公众号停更2个月 微博永久关停
  7. Linux系统安全保护措施
  8. 信息论基础(学习笔记整理)
  9. 机器学习的分类与主要算法
  10. ExamDiff Pro(电脑文件对比工具)官方正式版V12.0.1.8 | 最好用的文件对比工具之一文件内容对比工具下载
  11. smail语法 详解
  12. 保险核保、理赔|门诊住院发票识别||医疗单据医疗票据识别技术
  13. [actions] -- actions详细使用
  14. 可视化项目管理,项目进度管理必备工具
  15. 利用关联规则挖掘中医证素与恶性肿瘤的关系
  16. PS PhotoShop CS5 CS6 序列号 安装
  17. android设置UI界面背景,Android ROM定制——界面美化基础(framework-res、SystemUI修改)...
  18. 服装管理系统软件功能说明书
  19. 2021-12-3 温故而知新-JavaScript隐式转换
  20. 机器学习系列——机器学习三大类

热门文章

  1. MFC之添加PNG,JPG图片
  2. 【转】flex中的labelFunction(combox和dataGrid)
  3. WinSCP 提示:你的Shell可能与本程序不兼容(推荐使用Bash)。
  4. 那个高产似母猪的复旦计算机硕士
  5. 不要再闲玩啦!博主手把手带你两个月入门自然语言处理,还不赶紧碗里来!...
  6. 金融评分卡项目—7.申请评分卡中的数据预处理和特征衍生
  7. pandas—pd.DataFrame.sample
  8. 图论算法——有向图的邻接链表实现
  9. 如何高效工作,享受品质生活?看看少数派的经验总结吧
  10. 揭秘React同构应用