亿豪的python学习 day14

今天是面向对象学习的最后一天,探讨了多继承及其隔离变化的作用,同时强调了组合复用和依赖倒置原则。在多继承中,调用顺序遵循MRO(方法解析顺序)。另外,总结了面向对象的三大特征——封装、继承和多态,封装通过划分变化点实现,继承用于抽象统一,多态则体现在重写父类方法并有不同的子类实现。
摘要由CSDN通过智能技术生成

今天的学习内容

面向对象最后一天

在这里插入图片描述

"""
    技能系统
        特征:
            封装:将每种具体影响效果单独定义到类中
            继承:定义影响效果类,统一各种具体影响效果的做法。
                 从而隔离了释放器与具体影响效果的变化。
            多态:每种具体影响效果都是重写影响效果类
                 释放器调用影响效果类 SkillImpactEffect
                 创建具体影响效果(eval("子类名称")),调用影响方法。
                  DamageEffect     impact
        原则:
            开闭:增加新影响效果,释放器不变。
            单一: 每种影响效果都只负责自己的算法。技能释放器专注于释放技能。
            依赖倒置:技能释放器调用影响效果,没有调用伤害生命、消耗法力等具体做法.
            组合复用:技能释放器 与 影响效果是组合关系,而不是继承关系。
            里氏替换:...
            迪米特:所有类互不影响
        优势:
            外界一个需求的变化,内部只需要修改一个类。【单一职责】
            增加新影响效果,释放器不变。【开闭原则】
            一个技能改变一种影响效果,只需要修改配置文件,代码不用变化。【依赖注入】

"""


class SkillImpactEffect:
    """
        技能影响效果
    """

    def impact(self):#父类方法子类调用并重写
        pass


class DamageEffect(SkillImpactEffect):
    """
        伤害生命效果
    """

    def __init__(self, value=0, duration=0.0):
        self.value = value
        self.duration = duration

    def impact(self):
        super().impact()
        print("扣你%d血" % self.value)


class CostSPEffect(SkillImpactEffect):
    """
        消耗法力效果
    """

    def __init__(self, value=0):
        self.value = value

    def impact(self):
        super().impact()
        print("消耗%d法力" % self.value)


class DizzinessEffect(SkillImpactEffect):
    """
        眩晕效果
    """

    def __init__(self, duration=0):
        self.duration = duration

    def impact(self):
        super().impact()
        print("眩晕%d秒" % self.duration)


class LowerDeffenseEffect(SkillImpactEffect):
    """
        降低防御力效果
    """

    def __init__(self, value=0, duration=0):
        self.value = value
        self.duration = duration

    # 3. 重写
    def impact(self):
        super().impact()
        print("降低%d秒防御力" % self.duration)


class SkillDeployer:
    """
        技能释放器
    """

    def __init__(self, name=""):
        self.name = name
        self.__config_file = self.__load_config_file()
        self.__effect_objects = self.__create_effect_object()

    def __load_config_file(self):
        return {
            "六脉神剑": ["DamageEffect(50,6)"],
            "降龙十八掌": ["DamageEffect(200,18)", "DizzinessEffect(8)"],
            "小无相功": ["DamageEffect(200,18)", "LowerDeffenseEffect(0.5,10)", "CostSPEffect(30)"],
        }

    def __create_effect_object(self):
        list_effect_names = self.__config_file[self.name]
        effect_objects = []#创建技能释放效果列表
        for item in list_effect_names:
            # 2. 创建子类对象
            # "DamageEffect(50,6)" --> DamageEffect(50,6)
            obj = eval(item)#将字符串转为代码并运行
            effect_objects.append(obj)#添加技能释放效果
        return effect_objects

    def generate_skill(self):
        print(self.name, "释放啦")
        for item in self.__effect_objects:
            # 1. 调用父类方法
            item.impact()


lmsj = SkillDeployer("六脉神剑")
lmsj.generate_skill()

xlsbz = SkillDeployer("降龙十八掌")
xlsbz.generate_skill()

在这里插入图片描述
注:组合复用原则,依赖倒置原则

多继承

继承:隔离变化
多继承:被多个变化所隔离,不是代码的复用。
注:如果有多个重复方法,调用顺序由左到右,由下到上

三大特征

1.封装:[分] --> 变化点
人 车 飞机 船
2.继承:[隔] 抽象 --> 统一
交通工具
3.多态:[做] 重写 --> 调用父的一个方法,在不同子类上有不同实现。
运输功能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值