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() 

猜你喜欢

转载自blog.csdn.net/weixin_42161670/article/details/113464545