zoukankan      html  css  js  c++  java
  • day 20 小结

    继承

    1.什么是继承

    ​ 继承指的是新建类的方法,新建的类称之为字类或派生类

    ​ 字类继承的类叫做父类,也称之为基类或超类

    继承的特征:

    ​ 子类可以继承父类的属性(特征与技能),并且可以派生出自己的属性(特征与技能)

    ​ 注意: 在python中,一个子类可以继承多个父类

    2.为什么要继承

    ​ 继承的目的是为了减少代码的冗余(减少重复代码)

    3.如何实现继承

    ​ 1.首先要确定谁是子类,谁是父类.

    ​ 2.在定义类时,子类 + (), ()内写父类,实现继承

    # 父类
    class ParentClass1:
        pass
    
    class ParentClass2:
        pass
    # 子类
    class SubClass1(ParentClass1)
    	pass
    
    #查看继承的父类:__bases__, 时类的属性,用来查找当前父类
    print(SubClass1.__bases__)
    

    寻找继承关系

    如何寻找继承关系:

    ​ 要想寻找继承关系,首先要"先抽象,再继承"

    什么是抽象?

    ​ 抽象指的是抽取相似的部分,称之为抽象

    继承的关系:

    ​ 对象是特征与技能的结合体

    ​ 类是一系列对象相同的特征与技能的结合体

    ​ 继承是一系列类相同的特征与技能的结合体

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

    1.对象查找属性会从对象的名称空间中查找

    2.若对象没有,则回去类里面找

    3.若当前类是子类,并且没有对象找的属性,回去父类中查找

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

    # 父类
    class OldboyPeople:
        school = 'oldboy'
    
        def __init__(self, name, age, sex):
           self.name = name
            self.age = age
            self.sex = sex
    # 子类
    class OldboyTeacher(OldboyPeople):
    
        # 老师修改分数技能
        def change_score(self):
            print(f'老师[{self.name} 修改分数...]')
    
    tea1 = OldboyTeacher('tank', 17, 'male')
    print(tea1.school)
    # 查看对象名称空间
    print(tea1.__dict__)
    # __class__: 对象的属性,查看当前对象的类.
    # 查看子类名称空间
    print(tea1.__class__.__dict__)
    # 查看父类名称空间
    print(tea1.__class__.__bases__[0].__dict__)
    
    
    # 验证对象属性的查找顺序
    class Foo:
    
        def f1(self):
            print('Foo.f1')
    
        def f2(self):
            print('Foo.f2')
            self.f1()
    
    
    class Soo(Foo):
        def f1(self):
            print('Soo.f1')
    
    
    soo_obj = Soo()
    soo_obj.f2()
    '''
    Foo.f2
    Soo.f1
    '''
    

    派生

    什么是派生

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

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

    ​ 继承是谁与谁的关系,指的是类鱼类的关系,子类与父类是从属关系

    # 验证对象属性的查找顺序
    class Foo:
        def f1(self):
            print('Foo.f1')
    
        def f2(self):
            print('Foo.f2')
            self.f1()
    
    
    class Soo(Foo):
        def f1(self):
            print('Soo.f1')
    
    
    soo_obj = Soo()
    soo_obj.f1()  # Soo.f1
    
    

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

    方式一:

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

    方式一:
    class OldboyTeacher(OldboyPeople):
        # 等级, 薪资
        def __init__(self, name, age, sex, level, sal):
            OldboyPeople.__init__(self, name, age, sex)
            self.level = level
            self.sal = sal
    
    class OldboyStudent(OldboyPeople):
        # 课程
        def __init__(self, name, age, sex, course):
            OldboyPeople.__init__(self, name, age, sex)
            self.course = course
    
        def choose_course(self):
            print(f'学生{self.name}选择课程{self.course}')
    
    

    方式二:

    ​ super是一个特殊的类,在子类中调用super()

    class OldboyTeacher(OldboyPeople):
        # 等级, 薪资
        def __init__(self, name, age, sex, level, sal):
            super().__init__(name, age, sex)
            self.level = level
            self.sal = sal
    
    
    class OldboyStudent(OldboyPeople):
        # 课程
        def __init__(self, name, age, sex, course):
            super().__init__(name, age, sex)
            self.course = course
    
        def choose_course(self):
            print(f'学生{self.name}选择课程{self.course}')
    

    新式类和经典类

    了解:

    ​ 在python2中,才会有新式类和经典类之分.

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

    新式类:

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

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

    经典类

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

    菱形继承

    ​ 在多继承的情况下形成了菱形继承

    ​ 经典类

    ​ 深度优先

    ​ 新式类

    ​ 广度优先

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

    import json
    from datetime import date,datetime
    print(json.JSONEncoder)
    print(datetime.today())  # 当前时间
    print(date.today())  # 当前时间
    
    # isinstance:
    #	python内置的函数,可以传两个参数,判断参数一是否是参数二的一个实例
    
    # 开源者的角度: 修改json源码
    class MyJson(json.JSONEnocoder):
        def default(self,o):
            #  子类派生的功能
            #  判断o是否是datetime的一个实例
            if isinstance(o,datetime):
                return o.strtime('%Y-%m-%d %X')
            elif isinstance(o,date):
                return o.strtime('%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)
    
  • 相关阅读:
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
  • 原文地址:https://www.cnblogs.com/LZF-190903/p/11648580.html
Copyright © 2011-2022 走看看