• day19(类 组合 抽象)


    继承补遗

    # 继承中的查找顺序
    # 经典类: 深度优先
    # 新式类: 广度优先
    # mro方法
    # 只能新式类中使用,通过类名调用-->生成继承顺序的列表
    #
    # super()方法 : 按照mro列表顺序,从定义位置找到(调用super()类)的上一层类.而不是调用父类的方法
    """如例:Foo没有父类但是依旧可以调用super()"""
    class Foo:
        def f1(self):
            print('foo f1')
            super().f2()
    class Bar:
        def f2(self):
            print('bar f2')
    class Baz(Foo,Bar):
        pass
    baz = Baz()
    print(Baz.mro())
    baz.f1()
    baz.f2()

    组合

    # 组合
    # 当类中的属性包含其他的即 HAS-A 关系时,将类作为另一种类的属性,--> 组合
    # 为什么
    # 减少代码量,增强可拓展性,加强可概括性
    #
    '''方案一: 在对象层次产生联系'''
    class Class:
        def __init__(self,grade,course):
            self.grade = grade
            self.course = course
        def get_class(self):
            return (self.grade,self.course)
    
    class Member:
        def __init__(self):
            school = 'oldboy'
        def __init__(self,name,age,sex):
            self.name = name
            self.age = age
            self.sex = sex
    
    class Teacher(Member):
        def __init__(self,name,age,sex,):
            super().__init__(name,age,sex,)
        def teach(self):
            pass
    
    cla_0 = Class(15,'linux')
    cla_1 = Class(15,'化学')
    
    tae_0 = Teacher('llk',24,'male')
    tae_1 = Teacher('egon',24,'male')
    tae_0.Class = cla_0
    print(tae_0.Class.grade)
    tae_1.Class = cla_1
    print(tae_1.Class.get_class())
    
    
    """方案二 : 在定义类时就将需要组合的类联系在一起,在类层面产生联系"""
    class Member:
        def __init__(self):
            school = 'oldboy'
        def __init__(self,name,age,sex):
            self.name = name
            self.age = age
            self.sex = sex
    
    class Teacher(Member):
        def __init__(self,name,age,sex,Class):
            super().__init__(name,age,sex)
            self.Class = Class
        def get_class(self):
            return self.Class.get_class()
        def teach(self):
            pass
    
    class Student(Member):
        def __init__(self,name,age,sex,Class):
            super().__init__(name,age,sex)
            self.Class = Class
        def get_stu_class(self):
            return Class.get_class()
        def stude(self):
            pass
    
    class Class:
        def __init__(self,grade,course):
            self.grade = grade
            self.course = course
        def get_class(self):
            return (self.grade,self.course)
    
    cla_0 = Class(15,'linux')
    cla_1 = Class(15,'化学')
    tea_0 = Teacher('llk',24,'male',cla_0)
    tea_1 = Teacher('egon',24,'male',cla_1)
    print(tea_0.get_class())
    print(tea_1.get_class())
    
    # 小错误总结
    # 1 调用super()方法时一定要带小括号
    # 2 不要忘记向super().__init(name,age,sex)传入相应参数
    # 3 组合时调用类属性时,一定不要忘记带self.Class,定义时也一定带这self

    抽象

    # 接口 --> 是什么
    # C# 语言参考
    # 接口(C# 参考)
    # 定义:接口是一种约束形式,其中只包括成员定义,不包含成员实现的内容。
    # 目的:接口的主要目的是为不相关的类提供通用的处理服务,由于C#中只允许树形结构中的单继承,即一个类只能继承一个父类,所以接口是让一个类具有两个以上基类的唯一方式。 [2]
    # 接口只包含方法、属性、索引器和事件的签名。方法的实现是在实现接口的类中完成的
    # ps:在python中没接口类型所以 --> 衍生出 抽象类来实现接口的功能
    # 抽象类 --> 接口
    """具体实现"""
    import abc
    
    class Hero(metaclass=abc.ABCMeta):
        @abc.abstractmethod
        def attack(self):
            pass
    
        @abc.abstractmethod
        def skill_q(self):
            pass
    
        @abc.abstractmethod
        def skill_w(self):
            pass
    
        @abc.abstractmethod
        def skill_e(self):
            pass
    
        @abc.abstractmethod
        def skill_r(self):
            pass
    
    
    class Reven(Hero):
        def adad(self):
            print('adad')
    llk = Reven()
    llk.adad()
    # ps: 必须调用才可以发现是否符合抽象类
  • 相关阅读:
    How to Install Tomcat
    使用Application_Error捕获站点错误并写日志
    安装 SQL Server2008 安装程序规则支持提示“重新启动计算机”失败
    历史执行Sql语句性能分析 CPU资源占用时间分析
    返回List的分页方法
    @@IDENTITY与SCOPE_IDENTITY()
    Debugging Failed Because Integrated Windows Authentication Is Not Enabled
    一般经验总结
    dom中实现全选复选框的实例。
    dom中表格的修改 增加行例
  • 原文地址:https://www.cnblogs.com/lee1225/p/12661806.html
Copyright © 2020-2023  润新知