day20-继承、派生、菱形继承问题
继承
什么是继承
- 继承是一种新建类的方式,新建的类成为子类,被继承的类成为父类
- 继承的特性是:子类会遗传父类的属性
- 继承是类与类之间的关系
为什么要用继承
使用继承可以减少代码的冗余
如何继承
class Parent1:
pass
class Parent2:
pass
#python中支持一个类继承多个类,其他语言不支持
class Sub1(Parent1, Parent2):
pass
#使用__bases__方法可以获取对象继承的类
print(Sub1.__bases__)
类的分类
在Python3中如果一个类没有继承任何类,则默认继承object类
在Python2中如果一个类没有继承任何类,不会继承object类
新式类
继承了object的类以及该类的子类,都是新式类
Python3中所有的类都是新式类
经典类
没有继承object的类以及该类的子类,都是经典类
只有Python2中才有经典类
继承与抽象
要找出子类和父类关系,必须先抽象再继承,抽象即抽取类似或者说比较像的部分。
抽象分成两个层次:
- 将对象比较像的部分抽取成类;
- 将类比较像的部分抽取成父类。
抽象最主要的作用是划分类别(可以隔离关注点,降低复杂度)
对象查找属性的顺序
对象自己-》对象的类-》父类-》父类。。。
# __class__: 对象的属性,查看当前对象的类.
派生
派生:子类中新定义的属性的这个过程叫做派生,并且需要记住子类在使用派生的属性时始终以自己的为准
派生的两种方式
class OldboyPeople:
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex
#方式一
class OldboyTeacher(OldboyPeople):
# 等级, 薪资
def __init__(self, name, age, sex, level, sal):
OldboyPeople.__init__(self, name, age, sex)
self.level = level
self.sal = sal
#方式二
class OldboyTeacher(OldboyPeople):
# 等级, 薪资
def __init__(self, name, age, sex, level, sal):
super().__init__(name, age, sex)
self.level = level
self.sal = sal
菱形继承问题
当类是经典类时,多继承情况下,按照深度优先的方式查找
当类是新式类时,多继承情况下,按照广度优先的方式查找
通过继承修改json模块
import json
from datetime import date, datetime
print(json.JSONEncoder)
print(datetime.today()) # 当前时间
print(date.today()) # 当前日期
class MyJson(json.JSONEncoder):
def default(self, o):
# 子类派生的功能
# 判断o是否式datetime的一个实例
if isinstance(o, datetime):
return o.strftime('%Y-%m-%d %X')
elif isinstance(o, date):
return o.strftime('%Y-%m-%d')
else:
# 继承父类的default方法的功能
return super().default(self, o)
dict1 = {
'name': 'tank',
'today': datetime.today(),
'today2': date.today()
}
res = json.dumps(dict1, cls=MyJson) # cls=None,默认指向的是原json的JSONEncoder
print(res)
浙公网安备 33010602011771号