Python:面向对象之多太应用举例

需求:打印如下内容,实现人与不同的狗合作工作
张三 在工作
导盲犬正在导盲
张三 在工作
缉毒犬正在缉毒
张三 在工作
警犬正在工作

先来看一下笨方法怎么写

class PoliceDog(object):
    def attack_enemy(self):
        print('警犬正在攻击人')

class BlindDog(object):
    def lead_road(self):
        print('导盲犬正在领路')

class DrugDog(object):
    def drug(self):
        print('缉毒犬正在缉毒')

class Person(object):
    def __init__(self,name):
        self.name = name

    def work_with_dg(self):
        print(self.name,'在工作')
        self.dog.attack_enemy()

    def work_with_bd(self):
        self.dog.lead_road()

    def work_with_dd(self):
        self.dog.drug()

pd = PoliceDog()
p = Person('张三')
p.dog = pd
p.work_with_dg()

bd = BlindDog()
p.dog = bd
p.work_with_bd() # 每加一个狗都需要重新定义一个方法

dd = DrugDog()
p.dog = dd
p.work_with_dd() # 每加一个狗都需要重新定义一个方法

缺点:每多增加一只狗就要在Person类中定义对应的方法,代码冗余且重复率高

利用多太优化后代码:

# 狗父类
class Dog(object):
    def work(self):
        print('狗在工作')

# 狗子类
class BlindDog(Dog):
    def work(self):
        print('导盲犬正在导盲')

# 狗子类
class DrugDog(Dog):
    def work(self):
        print('缉毒犬正在缉毒')

# 狗子类
class PoliceDog(Dog):
    def work(self):
        print('警犬正在工作')

# 人类
class Person(object):
    def __init__(self, name):
        self.name = name

    def work_with_dog(self):
        print(self.name, '在工作')
        print('self.dog',self.dog)
        if self.dog is not None and isinstance(self.dog,Dog): #满足条件:self.dog不为None,且self.dog是由父类Dog实例化出来的(self.dog相当于狗子类)
            self.dog.work() # 相当于Blinddog().work/DrugDog().work/PoliceDog().work


# 实例对象
p = Person('张三')

bd = BlindDog()
p.dog = bd # Person类中增加狗的属性,使其等于狗的对象bd
p.work_with_dog()

dd = DrugDog()
p.dog = dd # Person类中增加狗的属性,使其等于狗的对象dd
p.work_with_dog()

pd = PoliceDog()
p.dog = pd # Person类中增加狗的属性,使其等于狗的对象pd
p.work_with_dog() 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值