day20 类的继承 类的继承 子类派生出新的属性,并重用父类的属性 新式类与经典类 钻石继承 通过继承实现修改json模块数据类型

继承多个父类

class ParentClass1:
    pass
class ParentClass2:
    pass
class SubClass(ParentClass1,ParentClass2):
    pass

查看继承的父类

__bases__是类的属性,用来查找当前类的父类

继承的关系

  1. 对象是特征的与技能的结合体
  2. 类是一系列对象相同的特征和技能的结合体
  3. 继承是一系列类的相同特征和技能的结合体

--->先抽象再分继承

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

  1. 对象查找属性会先从对象的名称空间中查找
  2. 若对象没有,则会去类里面找
  3. 若当前类是子类,并且没有对象找的属性,会去父类查找

注意:对象查找属性,若子类有,不管父类有没有,以子类的为准

查看对象名称空间

__dict__

对象的属性,查看当前对象的类

__class__

查看类名称空间

__class__.__dict__

查看父类名称空间

__class__.__bases__[0].__dict__

派生

派生指的是子类 继承父类的属性,并且派生出新的属性

子类派生出新的属性,若与父类的属性相同,则以子类的为准

继承是类与类的关系,子类与父类是从属关系

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

方式一:

直接通过父类(调用)__init__ 把 __init__ 当作普通函数使用,传入对象与继承的属性

class OldBoyPeople:
    def __init__(self,name,age,sex):
    self.name = name
    self.age = age
    self.sex = sex
class OldBoyPeople(OldBoyPeople):
    def __init__(self,name,age,sex,level,sal):
        OldBoyPeople.__init__(self,name,age,sex)
        self.level = level
        self.sal = sal

方式二

super是一个特殊的类。

在子类中调用super()会得到一个特殊的对象

通过“ . ” 指向的是父类的名称空间

class OldBoyPeople:
    def __init__(self,name,age,sex):
        self.name = name 
        self.age = age
        self.sex = sex
class OldBoyStudent(OldBoyPeople):
    def __init__(self,name,age,sex,course):
        super().__init__(name,age,sex)
        self.course = course

注意:两种方式不可混合使用,不易区分

新式类与经典类

在python2 中才会有新式类与经典类之分

在python3 中,所有的类都是新式类

新式类

继承object的类都称之为新式类

python3中,子类不继承自定义的类,默认继承object

class Foo(object):
    pass
class Goo(Foo):
    pass
print(Foo.__bases__)
print(Goo.__bases__)

经典类

在python2中,凡是没有继承object的类都是经典类

mro() 属于object------> type的函数,用来查看当前类的继承顺序

class A : 
    x =2 
class B : 
    x = 3 
class C(A,B) :
    print('C...')
    x = 1
#产看一下object类型为class
print(object)
#打印类的继承顺序
print(C.mro())

钻石继承

钻石继承可以称之为菱形继承

在多继承的情况下形成的钻石继承(继承顺序)

经典类

深度优先
day20 类的继承
类的继承
子类派生出新的属性,并重用父类的属性
新式类与经典类
钻石继承
通过继承实现修改json模块数据类型

新式类

广度优先

day20 类的继承
类的继承
子类派生出新的属性,并重用父类的属性
新式类与经典类
钻石继承
通过继承实现修改json模块数据类型

day20 类的继承
类的继承
子类派生出新的属性,并重用父类的属性
新式类与经典类
钻石继承
通过继承实现修改json模块数据类型

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

import json
from datetime import date,datetime 

print(json,JSONEncoder)
print(datetime.today())
print(date.today())

# 开发者:直接str转成字符串
#开源者:修改json源代码

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)
dict1 = {
    'name':'tank',
    'today':datetime.today(),
    'today2': date.today()
}
res = json.dumps(dict1,cls=MyJson)
print(res)