day20-继承、派生、菱形继承问题

继承

什么是继承

  1. 继承是一种新建类的方式,新建的类成为子类,被继承的类成为父类
  2. 继承的特性是:子类会遗传父类的属性
  3. 继承是类与类之间的关系

为什么要用继承

使用继承可以减少代码的冗余

如何继承

class Parent1:
    pass


class Parent2:
    pass

#python中支持一个类继承多个类,其他语言不支持
class Sub1(Parent1, Parent2):
    pass
#使用__bases__方法可以获取对象继承的类
print(Sub1.__bases__)

类的分类

在Python3中如果一个类没有继承任何类,则默认继承object类

在Python2中如果一个类没有继承任何类,不会继承object类

新式类

继承了object的类以及该类的子类,都是新式类

Python3中所有的类都是新式类

经典类

没有继承object的类以及该类的子类,都是经典类

只有Python2中才有经典类

继承与抽象

要找出子类和父类关系,必须先抽象再继承,抽象即抽取类似或者说比较像的部分。

抽象分成两个层次:

  1. 将对象比较像的部分抽取成类;
  2. 将类比较像的部分抽取成父类。

抽象最主要的作用是划分类别(可以隔离关注点,降低复杂度)

对象查找属性的顺序

对象自己-》对象的类-》父类-》父类。。。

# __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)

posted on 2019-10-10 14:54  shenblogs  阅读(140)  评论(0)    收藏  举报

导航