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: 必须调用才可以发现是否符合抽象类

 

posted @ 2020-04-08 18:36  不忘初心--方得始终  阅读(134)  评论(0编辑  收藏  举报