day20 类的继承

类的继承

继承多个父类

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())

钻石继承

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

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

经典类

深度优先

新式类

广度优先

通过继承实现修改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)
posted @ 2019-10-10 17:02  小凯子+  阅读(121)  评论(0编辑  收藏  举报