一、基本知识点
1、# 查询顺序:
对象.属性 : 先从对象空间找,如果找不到,再从类空间找,再找不到,再从父类找....
类名.属性 : 先从本类空间找,如果找不到,再从父类找....
对象与对象之间是互相独立的.
2、组合:给一个类的对象封装一个属性,这个属性是另一个类的对象
下面通过代码例子进行说明:
1 版本一:添加武器:斧子,刀,枪,棍,棒..., 2 class GameRole: 3 def __init__(self, name, ad, hp): 4 self.name = name 5 self.ad = ad 6 self.hp = hp 7 8 def attack(self,p): 9 p.hp = p.hp - self.ad 10 print('%s 攻击 %s,%s 掉了%s血,还剩%s血' %(self.name,p.name,p.name,self.ad,p.hp)) 11 12 class Weapon: 13 def __init__(self,name,ad): 14 self.name = name 15 self.ad = ad 16 def fight(self,p1,p2): 17 p2.hp = p2.hp - self.ad 18 print('%s 用%s打了%s,%s 掉了%s血,还剩%s血' 19 % (p1.name,self.name,p2.name,p2.name,self.ad,p2.hp)) 20 21 p1 = GameRole('大阳哥',20,500) 22 p2 = GameRole('印度阿宁',50,200) 23 axe = Weapon('三板斧',60) 24 broadsword = Weapon('屠龙宝刀',100) 25 axe.fight(p1,p2) 26 broadsword.fight(p2,p1) 27 28 p1.attack(p2)
其中不合理的地方是:人物利用武器攻击别人,你的动作发起者是人,而不是武器。其中第8行后人第16行里的p,p1,p2都是对象空间。
1 # 版本二: 2 class GameRole: 3 def __init__(self, name, ad, hp): 4 self.name = name 5 self.ad = ad 6 self.hp = hp 7 8 def attack(self,p): 9 p.hp = p.hp - self.ad 10 print('%s 攻击 %s,%s 掉了%s血,还剩%s血' %(self.name,p.name,p.name,self.ad,p.hp)) 11 12 def armament_weapon(self,wea): 13 self.wea = wea 14 15 16 class Weapon: 17 def __init__(self,name,ad): 18 self.name = name 19 self.ad = ad 20 def fight(self,p1,p2): 21 p2.hp = p2.hp - self.ad 22 print('%s 用%s打了%s,%s 掉了%s血,还剩%s血' 23 % (p1.name,self.name,p2.name,p2.name,self.ad,p2.hp)) 24 25 p1 = GameRole('大阳哥',20,500) 26 p2 = GameRole('印度阿宁',50,200) 27 axe = Weapon('三板斧',60) 28 broadsword = Weapon('屠龙宝刀',100) 29 # print(axe) 30 p1.armament_weapon(axe) # 给大阳哥 装备了三板斧这个对象. 31 # print(p1.wea) 32 # print(p1.wea.name) 33 # print(p1.wea.ad) 34 p1.wea.fight(p1,p2)
在GameRole类中加入了动态变量armament_weapon,给一个对象属性封装了另一个对象。具体过程如下:
面向对象资料参考:https://www.cnblogs.com/jin-xin/articles/9157737.html