- 计算有多少个实例化对象调用了一个类
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':