Python3 类的继承
继承的基本概念
什么是继承
继承指的是一种新建类的方法, 新建的类称之为子类或者派生类
子类继承的类叫做父类, 也称之为基类或者超类
- 类的特征: 子类可以继承父类的属性(特征和技能), 并且可以派生出自己的属性(特征和技能)
- 在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'>)
寻找继承关系
如何寻找继承关系
- 先抽象, 再继承
- 关系梳理:
- 对象是特征和技能的结合体
- 类是一系列对象相同特征和技能的结合体
- 父类是一系列子类相同的特征和技能的结合体
实例演示
# 父类
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...
继承背景下的对象属性查找顺序
在继承背景下, 对象的属性查找顺序:
- 先从对象的名称空间中查找
- 若对象没有, 会从子类中查找
- 若子类中没有, 则回去父类中查找
注意:
对象-->子类-->父类, 找到既停止寻找
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__ # ()
钻石继承
- 砖石继承也被称为菱形继承, 是在多继承情况下的形成的
- 砖石继承的继承顺序:
- 经典类: 深度优先
- 新式类: 广度优先
.png)
我们也可以通过子类.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 类的继承的更多相关文章
- Python3 类的继承小练习
1.打印并解释结果 class Parent(object): x = 1 class Child1(Parent): pass class Child2(Parent): pass print(Pa ...
- Python3 类和继承和组合
import random as r class Fish: def __init__(self): self.x = r.randint(0,10) self.y = r.randint(0,10) ...
- python3 入门 (四) 类与继承
Python 类 Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法. 对象可以包含任意数量和类型的数据. p ...
- PYTHON3中 类的继承
继承 1:什么是继承 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,也就是说在python中支持一个儿子继承多个爹. 新建的类成为子类或者派生类. 父类又可以成为基类或者 ...
- python3 类的属性、方法、封装、继承及小实例
Python 类 Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法. 对象可以包含任意数量和类型的数据. p ...
- Python3 面向对象-类的继承与派生
1.什么是继承? 继承是一种创建新类的方式,新建的类可以继承一个或多个父类(python支持多继承),父类可称为基类或超类,新建的类称为派生类和或子类. 子类会遗传父类的属性,从而解决代码重用问题. ...
- python3 面向对象、类、继承、组合、派生、接口、子类重用父类方法
对象是特征(变量)与技能(函数)的结合体而类是一系列对象共同的特征与技能的集合体 class teacher: lesson = "python" def __init__(sel ...
- 【Python五篇慢慢弹(5)】类的继承案例解析,python相关知识延伸
类的继承案例解析,python相关知识延伸 作者:白宁超 2016年10月10日22:36:57 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给 ...
- Day7 类的继承和继承实现的原理
继承可以分为但继承,多继承. 继承的基本形式 class ParentClass1(object): #定义父类 pass class ParentClass2: #定义父类 pass class S ...
随机推荐
- 设计模式(Java语言)- 简单工厂模式
简单工厂模式有称为静态工厂模式,属于设计模式中的创建型模式.简单工厂模式通过对外提供一个静态方法来统一为类创建实例.简单工厂模式的目的是实现类与类之间解耦,其次是客户端不需要知道这个对象是如何被穿创建 ...
- C#查看已下载文件大小和扩展名
FileInfo fi = new FileInfo(fullfile);//fullfile文件路径 ong Size = fi.Length;//查看已下载文件的大小 C# 获取文件名及扩展名 s ...
- Python3.7.1学习(二)使用schedule模块定时执行任务
python中有一个轻量级的定时任务调度的库:schedule.他可以完成每分钟,每小时,每天,周几,特定日期的定时任务.因此十分方便我们执行一些轻量级的定时任务. 1 安装 1.1在cmd中输入p ...
- 【前端知识体系-JS相关】JS基础知识总结
1 变量类型和计算 1.1 值类型和引用类型的区别? 值类型:每个变量都会存储各自的值.不会相互影响 引用类型:不同变量的指针执行了同一个对象(数组,对象,函数) 1.2 typeof可以及检测的数据 ...
- 力扣(LeetCode)环形链表 个人题解
给定一个链表,判断链表中是否有环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos 是 -1,则在该链表中没有环. 示例 1: 输入: ...
- mongodb存储二进制数据
mongodb 3.x存储二进制数据并不是以base64的方式,虽然在mongo客户端的查询结果以base64方式显示,请放心使用.下面来分析存储文件的存储内容.base64编码数据会增长1/3成为顾 ...
- Condition对象以及ArrayBlockingQueue阻塞队列的实现(使用Condition在队满时让生产者线程等待, 在队空时让消费者线程等待)
Condition对象 一).Condition的定义 Condition对象:与锁关联,协调多线程间的复杂协作. 获取与锁绑定的Condition对象: Lock lock = new Reentr ...
- node后台初始配置(2)
一.node-app结构 创建成功node-app项目后,会自动生成一些文件一般初始的结构如下图 在bin文件夹里面只有一个文件www var port = normalizePort(pr ...
- Djangoday2第二个app加减法
第二个app 计算新建一个app在view定义显示的内容修改urls指定连接对应的视图测试另一种通过路径传参的方式访问网址路径传参的urls定义方法网址路径传参测试urls的urlnamedjango ...
- jsp 实现查询功能
要求: 实现查询功能 1.数据库代码 create database mvce; use mvce; create table test2( id int not null identity, tna ...