继承的基本概念

什么是继承

继承指的是一种新建类的方法, 新建的类称之为子类或者派生类

子类继承的类叫做父类, 也称之为基类或者超类

  • 类的特征: 子类可以继承父类的属性(特征和技能), 并且可以派生出自己的属性(特征和技能)
  • 在Python中, 一个子类可以继承多个父类(多继承)

继承有什么用

继承的目的是减少代码的冗余(减少重复代码)

如何实现继承

在定义类时候, 通过class 子类(父类):实现继承

初识继承

下面我们就通过代码来实现继承

# 父类
class ParentClass1:
pass # 父类
class ParentClass2:
pass # 子类 单继承
class ChildClass1(ParentClass1):
pass # 子类 多继承
class ChildClass2(ParentClass1, ParentClass2):
pass

我们可以通过__bases__方法来查看当前类继承的父类

# 查看当前类的父类
print(ChildClass1.__bases__) # (<class '__main__.ParentClass1'>,) print(ChildClass2.__bases__) # (<class '__main__.ParentClass1'>, <class '__main__.ParentClass2'>)

寻找继承关系

如何寻找继承关系

  • 先抽象, 再继承
  • 关系梳理:
    1. 对象是特征和技能的结合体
    2. 类是一系列对象相同特征和技能的结合体
    3. 父类是一系列子类相同的特征和技能的结合体

实例演示

# 父类
class PyMan:
language = 'Python' def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender # 老师类
class PyTeacher(PyMan):
def teach_python(self):
print(f'老师[{self.name}]在教Python...') # 学生类
class PyStudent(PyMan):
def learn_python(self):
print(f'学生[{self.name}]在学Python...') teacher = PyTeacher('龟叔', 18, 'female')
student = PyStudent('MrBigB', 17, 'male') print(teacher.name, teacher.age, teacher.gender) # 龟叔 18 female
print(student.name, student.age, student.gender) # MrBigB 17 male teacher.teach_python() # 老师[龟叔]在教Python...
student.learn_python() # 学生[MrBigB]在学Python...

继承背景下的对象属性查找顺序

  • 在继承背景下, 对象的属性查找顺序:

    1. 先从对象的名称空间中查找
    2. 若对象没有, 会从子类中查找
    3. 若子类中没有, 则回去父类中查找

    ​ 注意: 对象-->子类-->父类, 找到既停止寻找

class ParentClass:
def f1(self):
print('from ParentClass.f1') def f2(self):
print('from ParentClass.f2') class ChildClass(ParentClass):
def f1(self):
print('from ChildClass.f1') obj = ChildClass() obj.f1() # from ChildClass.f1
obj.f2() # from ParentClass.f2

派生

  • 什么是派生: 指的是子类在继承了父类的属性基础上, 又拥有了自己的一些属性, 这些属性就是派生出来的

  • 子类会覆盖父类的属性, 子类和父类是从属关系

  • 子类派生出新的属性, 并重用父类的属性:

    对于上面老师和学生的例子, 如果我们要给老师增加薪资属性, 学生增加班级班级属性

    super().__init__() 等同于Pyman.__init__()

class PyMan:
language = 'Python' def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender # 老师类
class PyTeacher(PyMan):
def __init__(self, name, age, gender, salary):
super().__init__(self, name, age, gender)
self.salary = salary def teach_python(self):
print(f'老师[{self.name}]在教Python...') # 学生类
class PyStudent(PyMan):
def __init__(self, name, age, gender, class_no):
super().__init__(self, name, age, gender)
self.class_no = class_no def learn_python(self):
print(f'学生[{self.name}]在学Python...')

新式类和经典类

  • 在Python2中, 才会有新式类和经典类之分
  • 在Python3中, 所有类都是新式类
  • 新式类: 继承object的类都是新式类. 在Python3中, 没有继承自定义类的, 默认继承object. 父类是新式类, 则子类也是新式类, 因此Python3中所有的类都是新式类
  • 经典类: 在Python2中, 凡是没有继承object的类都是经典类
# Python3
class A(object):
pass class B:
pass print(A.__bases__) # (<class 'object'>,)
print(B.__bases__) # (<class 'object'>,)
# Python2
class A(object):
pass class B:
pass print A.__bases__ # (<class 'object'>,)
print B.__bases__ # ()

钻石继承

  • 砖石继承也被称为菱形继承, 是在多继承情况下的形成的
  • 砖石继承的继承顺序:
    1. 经典类: 深度优先
    2. 新式类: 广度优先

我们也可以通过子类.mro()方法查看方法解析顺序

class G:
pass class E(G):
pass class B(E):
pass class F(G):
pass class C(F):
pass class D(G):
pass class A(B, C, D):
pass print(A.mro()) '''
[<class '__main__.A'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.F'>, <class '__main__.D'>, <class '__main__.G'>, <class 'object'>]
'''

通过继承实现修改json模块数据类型

# 增加date和datetime两种数据类型

import json
from datetime import date, datetime dict = {
'language': 'Python',
'date': date.today(),
'time': datetime.today()
} class MyJson(json.JSONEncoder):
def default(self, o): if isinstance(o, datetime):
return o.strftime('%Y-%m-%d %X')
elif isinstance(o, date):
return o.strftime('%Y-%m-%d')
else:
return super().default(self, o) res = json.dumps(dict, cls=MyJson) # # cls=None,默认指向的是原json的JSONEncoder print(res)
# {"language": "Python", "date": "2019-10-10", "time": "2019-10-10 18:13:39"}

Python3 类的继承的更多相关文章

  1. Python3 类的继承小练习

    1.打印并解释结果 class Parent(object): x = 1 class Child1(Parent): pass class Child2(Parent): pass print(Pa ...

  2. Python3 类和继承和组合

    import random as r class Fish: def __init__(self): self.x = r.randint(0,10) self.y = r.randint(0,10) ...

  3. python3 入门 (四) 类与继承

    Python 类 Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法. 对象可以包含任意数量和类型的数据. p ...

  4. PYTHON3中 类的继承

    继承 1:什么是继承 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,也就是说在python中支持一个儿子继承多个爹. 新建的类成为子类或者派生类. 父类又可以成为基类或者 ...

  5. python3 类的属性、方法、封装、继承及小实例

    Python 类 Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法. 对象可以包含任意数量和类型的数据. p ...

  6. Python3 面向对象-类的继承与派生

    1.什么是继承? 继承是一种创建新类的方式,新建的类可以继承一个或多个父类(python支持多继承),父类可称为基类或超类,新建的类称为派生类和或子类. 子类会遗传父类的属性,从而解决代码重用问题. ...

  7. python3 面向对象、类、继承、组合、派生、接口、子类重用父类方法

    对象是特征(变量)与技能(函数)的结合体而类是一系列对象共同的特征与技能的集合体 class teacher: lesson = "python" def __init__(sel ...

  8. 【Python五篇慢慢弹(5)】类的继承案例解析,python相关知识延伸

    类的继承案例解析,python相关知识延伸 作者:白宁超 2016年10月10日22:36:57 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给 ...

  9. Day7 类的继承和继承实现的原理

    继承可以分为但继承,多继承. 继承的基本形式 class ParentClass1(object): #定义父类 pass class ParentClass2: #定义父类 pass class S ...

随机推荐

  1. 领扣(LeetCode)错误的集合 个人题解

    集合 S 包含从1到 n 的整数.不幸的是,因为数据错误,导致集合里面某一个元素复制了成了集合里面的另外一个元素的值,导致集合丢失了一个整数并且有一个元素重复. 给定一个数组 nums 代表了集合 S ...

  2. AV时间戳dts,pts。从ffmpeg解码过程看过来。

    解码过程中,dts由媒体流读入的包推动(解码包中的dts标记),dts在前进.pts是在dts前进到某处(截点)而进行动作的标记. 物理时间自然流逝,dts可以被控制同步与物理时间同一脚步节奏,也可以 ...

  3. PostGIS 报错为org.postgresql.util.PSQLException:错误: Operation on mixed SRID geometries

    说明: 在用Openlayers与Geoserver进行开发,做在线编辑功能时,出现一个问题:每当我新增了一根要素后,再次用wfs的方式进行点击查询时,会报错mixed SRID. 通过研究发现在数据 ...

  4. 投票通过,PHP 8 确认引入 Union Types 2.0

    关于是否要在 PHP 8 中引入 Union Types 的投票已于近日结束,投票结果显示有 61 名 PHP 开发组成员投了赞成票,5 名投了反对票. 还留意到鸟哥在投票中投了反对票~) 因此根据投 ...

  5. k8s Ingress 理解和部署

    目录 前言 Ingress 与 ingress-controller Ingress 部署 1.部署 ingress-controller 2.部署测试 web 服务 3.部署 Ingress 4.检 ...

  6. 常见 MIME 类型列表(转)

    本文转自:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Complete_list_of_MI ...

  7. leetcode 114二叉树转换成链表

    解法一 可以发现展开的顺序其实就是二叉树的先序遍历.算法和 94 题中序遍历的 Morris 算法有些神似,我们需要两步完成这道题. 将左子树插入到右子树的地方 将原来的右子树接到左子树的最右边节点 ...

  8. yum运行报错:libcurl.so.4: cannot open shared object file: No such file or directory

    /usr/lib64/目录下存在libcurl.so.4文件 CURL的动态库找不到,这里我们加入到ld.so.conf [root@localhost bin]#  vim /etc/ld.so.c ...

  9. 使用FastReport报表工具实现信封套打功能

    在较早期的报表套打的时候,我倾向于使用LODOP的ActiveX进行报表的打印或者套打,BS效果还是很不错的.之前利用它在Winform程序里面实现信封套打功能,详细参考<基于信封套打以及批量打 ...

  10. 运维常用 MySQL 命令

    目录 设置用户密码 方法一 方法二 丢失root密码找回 添加用户 设置用户密码 方法一 SET PASSWORD FOR 'root'@'localhost' = PASSWORD('NewPass ...