zoukankan      html  css  js  c++  java
  • 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)
    
  • 相关阅读:
    高斯消去法
    【转】sscanf和sprintf是scanf和printf家族的一对成员
    ps电信
    XNA准备篇(一)
    超级BT的SQL2008 在WIN7下附加 SQL2005的数据库
    绘制半口角
    动态的在输入框边上显示可输入的剩余字符数
    CallContext vs. ThreadStatic vs. HttpContext[待翻译]
    Vista 系统下安装 GhostDoc for Visual Studio 2008
    非常优秀的开源框架地址
  • 原文地址:https://www.cnblogs.com/kaizi111/p/11649231.html
Copyright © 2011-2022 走看看