- 计算有多少个实例化对象调用了一个类
class A:
count = 0 def __init__(self): A.count += 1 a1 = A() a2 = A() print(A.count) # 2
2. 组合就是将一个对象封装到另一个对象的属性中
class Game_role:
def __init__(self, name, ad, hp): self.name = name self.ad = ad self.hp = hp def attack(self, obj2): print("%s攻击了%s, %s掉了%s血,还剩%s血" % (self.name, obj2.name, obj2.name, self.ad, obj2.hp-self.ad)) class Weapen: def __init__(self, name, ad): self.name = name self.ad = ad def weapen_attack(self, p1, p2): # 这里表示会受到人和武器的双重伤害 p2.hp -= self.ad + p1.ad print("%s利用%s攻击了%s,%s还剩%s血" % (p1.name, self.name, p2.name, p2.name, p2.hp)) # 实例化两个游戏角色对象 p1 = Game_role("盖伦", 10, 100) p2 = Game_role("剑豪", 20, 80) # 实例化一个武器对象 pillow = Weapen("枕头", 2) pillow.weapen_attack(p1, p2) # 运行结果: 盖伦利用枕头攻击了剑豪,剑豪还剩68血
3. 上面的示例中有个奇怪的地方,就是实例化一个武器对象 pillow 后,它调用了 weapen_attack() 方法,也就是这个武器作为发起者。按照正常逻辑来说,应该是人发起攻击才合理
class Game_role:
def __init__(self, name, ad, hp): self.name = name self.ad = ad self.hp = hp def attack(self, obj2): print("%s攻击了%s, %s掉了%s血,还剩%s血" % (self.name, obj2.name, obj2.name, self.ad, obj2.hp-self.ad)) def equip_weapen(self, w): # 给对象封装一个属性,该属性是另一个类的对象 self.w = w class Weapen: def __init__(self, name, ad): self.name = name self.ad = ad def weapen_attack(self, p1, p2): p2.hp -= self.ad + p1.ad print("%s利用%s攻击了%s,%s还剩%s血" % (p1.name, self.name, p2.name, p2.name, p2.hp)) p1 = Game_role("盖伦", 10, 100) p2 = Game_role("剑豪", 20, 80) pillow = Weapen("枕头", 2) print(p1.__dict__) # 运行结果: {'name': '盖伦', 'ad': 10, 'hp': 100} # 这里是重点,pillow 是另一个类 Weapen 的实例化对象 # 此时类 Game_role 的一个实例化对象 p1 调用类的方法 equip_weapon 时 # pillow 作为参数传进去,相当于是一个人 p1 "装备了" pillow "这个武器" # 也就是说,p1 这个实例化对象多了一个属性 pillow p1.equip_weapen(pillow) print(p1.__dict__) # 运行结果: {'name': '盖伦', 'ad': 10, 'hp': 100, 'w': <