面向对象编程之继承

继承的定义:是一种新建类的方式新建的类称之为子类或派生类被继承的父类称之为基类或超类

继承的作用:子类会“”遗传”父类的属性,从而解决代码重用问题。也就是减少代码的冗余

继承的实现

继承描述的是子类与父类之间的关系,是一种什么是什么的关系。要找出这种关系,得先抽象,再继承。抽象即抽取类似或者说比较像的部分。分为以下两个方面:

  • 抽取对象之间相似的部分,总结出类
  • 抽取类之间相似的部分,总结出父类

语法:子类名(父类名)

# 父类
class Animal:
name = "animal"
def __init__(self, hp, attack):
self.hp = hp
self.attack = attack
# 子类
class Dog(Animal):
name = "dog"
def running(self):
print("from Animal running……")

注意:

1.程序的执行顺序由上到下,父类必修定义在子类上方

2.若子类的名字与父类的名字相同,则优先使用子类的名字。

# 按照上面的代码,输出Dog类的name属性
print(Dog.name) # 输出dog
print(Animal.name) # 输出animal

派生:子类继承父类属性与方法,并衍生出自己独有的属性和方法

class Dog(Animal):
name = "dog"
# 自己的属性
dog_type = "哈士奇"
# 自己的方法
def run(self):
print("dog is running……") dog_1 = Dog(1000, 300)
print(dog_1.name, dog_1.dog_type)
dog_1.run()

输出结果

dog 哈士奇
dog is running……

在子类衍生出自己的独有属性值时,父类有的话,是可以直接调用,不需要在子类中再次定义,这样会造成代码冗余。也就是说,子类可以重用父类的属性,并派出新的属性

重用父类属性的两种方式:

1.**直接引用父类的__init__(),向其传参,再增加子类属性 **

# 第一种方式
class Cat(Animal):
# 1.直接应用父类Animal的__init__()
def __init__(self, name, hp, attack):
Animal.__init__(self, hp, attack)
# 2.新增自己特有的属性
self.name = name

2.通过super来指向类的属性。super是一个特殊的类,调用supper得到一个对象,这个对象指向父类的名称空间。

# 第二种方式
class Dog(Animal):
def __init__(self, name, hp, attack):
# 使用super()时,不用传self这个参数,会自动传
super().__init__(hp, attack)
self.name = name

注意:这两种方法都可以使用,但是不建议混用


在python中,子类是可以继承多个父类的,这点是其他编程语言所没有的特性

class Sports():
print("from Sports……") class Ball():
print("from Ball") class Football(Ball, Sports):
print("from Football……") f = Football()
print(f)

输出结果

from Sports……
from Ball
from Football……
<__main__.Football object at 0x0000029E38E9F9C8>

可以发现,多重继承的情况下,对象的属性在父类中的是从左到右的.

比如说,上述代码中的 supper,严格遵循mro继承顺序。

mro调用mro返回的是一个继承序列。

为什么说不一定呢,我们来了解下新式类和经典类

新式类:凡是继承object的类或子孙类都是新式类

经典类: 没有继承object的类就是经典类

但是,在python3 中,所有的类默认继承object类,因此,python3中只有新式类

在python2中,才有经典类和新式类之分

新式类的查找顺序

# 这是个新式类,在python 3.*和python 2.* 解释器上执行
class A(object):
def test(self):
print('from A')
class B(A):
def test(self):
print('from B')
class C(A):
def test(self):
print('from C')
class D(B):
def test(self):
print('from D')
class E(C):
def test(self):
print('from E')
class F(D, E):
def test(self):
print('from F')
pass

查找顺序

"""
F --> D --> B --> E --> C --> A
也就是说,当属性在F中没有,会去父类D中查找;
D中没有,去父类B中查找;
B中没有,去父类E中查找;
E中没有,去父类C中查找;
C中没有,去父类A中查找。
"""

经典类的查找顺序

# 经典类,在python 2.* 解释器上执行
class A():
def test(self):
print('from A')
class B(A):
def test(self):
print('from B')
class C(A):
def test(self):
print('from C')
class D(B):
def test(self):
print('from D')
class E(C):
def test(self):
print('from E')
class F(D, E):
def test(self):
print('from F')
pass

查找顺序

"""
F --> D --> B --> A --> E --> C
也就是说,当属性在F中没有,会去父类D中查找;
D中没有,去父类B中查找;
B中没有,去父类A中查找;
A中没有,去父类E中查找;
E中没有,去父类C中查找;
"""

这是因为新式类的查找顺序是广度优先,经典类的查找顺序是深度优先

比如说,经典的钻石继承(又叫菱形继承)

python基础-面向对象编程之继承的更多相关文章

  1. python基础-面向对象编程之多态

    面向对象编程之多态以及继承.抽象类和鸭子类型三种表现形式 多态 定义:同一种类型的事物,不同的形态 作用: 多态也称之为"多态性".用于在不知道对象具体类型的情况下,统一对象调用方 ...

  2. python基础-面向对象编程之组合

    面向对象编程之组合 定义:一个对象中拥有另一个或其他多个对象的属性和方法. 作用:减少代码的冗余,降低耦合度 关于耦合度的说明 耦合:通俗地讲,就是相互作用,相互影响的意思 耦合度越高,程序的可扩展性 ...

  3. python基础-面向对象编程之封装、访问限制机制和property

    面向对象编程之封装 封装 定义:将属性和方法一股脑的封装到对象中,使对象可通过"对象."的方式获取或存储数据. 作用:让对象有了"."的机制,存取数据更加方便 ...

  4. python基础-面向对象编程之反射

    面向对象编程之反射 反射 定义:通过字符串对对象的属性和方法进行操作. 反射有4个方法,都是python内置的,分别是: hasattr(obj,name:str) 通过"字符串" ...

  5. Python基础教程之List对象 转

    Python基础教程之List对象 时间:2014-01-19    来源:服务器之家    投稿:root   1.PyListObject对象typedef struct {    PyObjec ...

  6. Python基础教程之udp和tcp协议介绍

    Python基础教程之udp和tcp协议介绍 UDP介绍 UDP --- 用户数据报协议,是一个无连接的简单的面向数据报的运输层协议.UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但 ...

  7. python基础之类的继承与派生、组合、接口与归一化设计、抽象类、子类中调用父类方法

    一.什么是继承 继承是一种创建新的类的方式,新建的类可以继承自一个或者多个父类,原始类称为基类或超类,新建的类称为派生类或子类. 派生:子类继承了父类的属性,然后衍生出自己新的属性,如果子类衍生出的新 ...

  8. python基础--类的继承以及mro

    继承: 什么是继承: 继承是一种关系,描述两个对象之间什么是什么的关系 在程序中,继承描述的是类和类之间的关系 例如 a继承了b,a就能直接使用b已经存在的方法和属性了 a称之为子类,b称之为父类,成 ...

  9. Python基础(十一) 类继承

    类继承: 继承的想法在于,充份利用已有类的功能,在其基础上来扩展来定义新的类. Parent Class(父类) 与 Child Class(子类): 被继承的类称为父类,继承的类称为子类,一个父类, ...

随机推荐

  1. 9i oracle数据库迁移到11G(exp)

    这个是之前生产上打算迁移的文档,后面离职了没有在停机迁移,但是测试过几次没有问题,其中需要把9I的110,120库迁移到11g一个数据库中,但是110,120库之间有相同的表名字,以及有DBLINK. ...

  2. justjavac(迷渡)知乎live--<<前端工程师的入门与进阶>>听讲总结

    知乎听讲总结 知乎live----jjc<前端工程师的入门进阶> git地址 内容 前端的基础知识,计算机专业基础知识感觉还行.前端后台都有做过,现在觉得自己要深入.但是只看框架源码和自己 ...

  3. php curl 生成的cookie 文件含义 cookie 属性含义

    最近用了curl 感觉还是很方便的,看了下curl生成的 cookie 文件 格式 , 对其中一些值的含义不是很明白,去找了些cookie的资料看了下,做下备忘 PHP curl 生成 的 cooki ...

  4. Windows 10 与 kali 双系统安装

    一.教程中用到的工具如下: 1.kali 2019镜像, 2.U盘 现在最低也有8G吧 3.软碟通 ,U盘刻录工具 4.win 10系统要留出一个空的硬盘,哪个盘的空间比较大可以压缩出大概100G的空 ...

  5. CSPS模拟 63

    每天都考试都快傻了O_o $T1 Median$ 一看就不能从通项上下手.. 那么就是..给你一个序列..区间中位数.. 对顶堆! 爆调2h,心态炸裂. 据说根据鬼畜的函数定义和$mod<=le ...

  6. [LLL邀请赛]参观路线(图论+dfs)

    emmmm....学校的oj被查水表了,扒不到原题面,所以.... 但是我还是扒到了题面... 题目大意:给定一个完全图,删掉其中一些边,然后求其字典序最小的遍历顺序 有点像去年day2T1啊.... ...

  7. 浅谈 KMP 算法

    最近在复习数据结构,学到了 KMP 算法这一章,似乎又迷糊了,记得第一次学习这个算法时,老师在课堂上讲得唾沫横飞,十分有激情,而我们在下面听得一脸懵比,啥?这是个啥算法?啥玩意?再去看看书,完全听不懂 ...

  8. canvas线条实践之运动的正方形

    原理说明: 1.通过rect实现正方形的绘制: 2.save保存canvas面板的保存,restore回复保存的canvas面板到初始状态: 3.translate用于改变canvas坐标的起始位置: ...

  9. 你知道如何优化Join语句吗?

    join语句的两种算法,分别是:NLJ和BNL 测试数据: create table t1(id int primary key, a int, b int, index(a)); create ta ...

  10. JVM 中你不得不知的一些参数

    有的同学虽然写了一段时间 Java 了,但是对于 JVM 却不太关注.有的同学说,参数都是团队规定好的,部署的时候也不用我动手,关注它有什么用,而且,JVM 这东西,听上去就感觉很神秘很高深的样子,还 ...