# -*- coding:utf-8 -*-
"""
客户端代码调用父类,子类方法真正执行动作。---->多态
新增子类方法,并不影响客户端代码和父类代码。--->开闭
"""
class Grenade:
def __init__(self):
"""
手榴弹类,作为客户端代码,调用伤害对象父类。
"""
self.atk = 500 # 攻击
def explosion_effects(self, target):
"""
调用伤害对象父类,传入攻击作为参数
"""
print('手榴弹爆炸!!!!')
target.get_hurt(self.atk)
class Injured_object:
"""
伤害对象父类,仅做简单的逻辑或者直接pass
"""
def get_hurt(self, atk):
pass
class Buildings(Injured_object):
def __init__(self):
self.hp = 10000
def get_hurt(self, atk):
self.hp -= atk
print('建筑物受到%s伤害,剩余%s生命值' % (atk, self.hp))
class Players(Injured_object):
def __init__(self):
self.hp = 1200
def get_hurt(self, atk):
self.hp -= atk
print('玩家受到%s伤害,剩余%s生命值' % (atk, self.hp))
if __name__ == '__main__':
i = Injured_object()
b = Buildings()
p = Players()
g = Grenade()
g.explosion_effects(b) # 建筑物对象传入给手榴弹的某方法中
g.explosion_effects(p) # 玩家对象传入给手榴弹的某方法中
由脚本执行结果印证了。客户端代码调用父类方法,但实际中执行的事子类的方法。当子类方法需要新增,修改,删除等,均不影响客户端代码和父类。符合开闭原则。而调用一个父类,却可以呈现不同子类的效果,是为多态。