对象的组合就是互可以互相调用创建对象类中的方法
对象的组合:就是一个对象的属性值是另外一个类的对象
一个类的对象作为另一个类对象的属性(就是把一个对象传递进一个类中当作参数 并且这个参数可以传递给对象的 ,一般是直接定义给init,因为init方法的属性是直接可以给对象的,如果定义在其他地方也需要用self来接收)
组合就是让两个类有可以起到关联 可以使用被调用对象的创建类中的方法,组合有两种,一种是在外部创建了对象 然后把你要调用的对象以参数的形式给传递进要调用者,也可以指着把对象定义在类内部就是直接把得到的对象传递进init方法中
组合的练习:
做一个人狗大战但是可以购买装备的程序:
class Person(object): def __init__(self,name,sex, hp, ad): self.name = name self.sex = sex self.hp = hp self.ad = ad self.money = 0 #定义一个默认的属性钱数 #再定义一个人攻击狗的方法 def attack(self,d): d.hp -= self.ad #被攻击者的血等于攻击者的攻击力 print('{}攻击了{},{}掉了{}血'.format(self.name,d.name, d.name,self.ad)) #人想要攻击其他的事物也可以装备物品来攻击 这样就选哟定义一个装备物品的方法 def wear(self,weapon): # self.weapon = weapon if self.money >= weapon.price : #你要先判断一下您的钱数是不是可以足够购买 self.weapon = weapon #您这是装备一个武器 但是武器是有价格的所以您需要把您的钱数减去武器的价格 self.money -= self.weapon.price print('购买成功 您已经装备成功') else: print('余额不足请充值') #装备后你要拿着你装备后的武器去进攻你所要进攻的物品 def attack_with_weapon(self,dog): if 'weapon' in self.__dict__: #判断你的weapon是不是已经被接收了 定义为自己本身的 self.weapon.skill(dog) #调用你所组合类的对象的方法 else : print('清先装备武器') #你要装备一个装备 但是不能平白无故的装备啊 你必须要进行充值的 def pay(self): money = int(input('请输入您要输入的金额')) self.money +=money #本身的钱 一直加上您充值进来的钱 print('您的余额是%s'%self.money) class Dog(object): def __init__(self, name, kind, hp, ad): #定义一个类的初始化方法 self.name =name self.kind = kind self.hp = hp self.ad = ad def attack1(self, p): #定义一个狗攻击人的类 p.hp -= self.ad print('{}攻击了{},{}掉了{}血'.format(self.name, p.name,p.name, self.ad)) #定义一个工具类 因为游戏里人是可以装备工具用来攻击其他事物的 class weapon(object): def __init__(self,name,price, ad, level): self.name = name self.price =price self.ad =ad self.level = level def skill(self,dog): dog.hp -=self.ad print('{}攻击了{},{}掉了{}血'.format(self.name, dog.name, dog.name, self.ad)) #实例化你所创建的类的对象 alex = Person('老王', '男', 100, 30) tendy = Dog('本本', 'teddy', 150,150) futou = weapon('斧头', 1000, 100,1) lst = ['攻击','充值','装备武器','使用武器攻击'] while True: for index, value in enumerate(lst,1): num = int(input('请输入您要选择的序列号')) if num == 1 : alex.attack(tendy) #让人去攻击狗 elif num == 2 : alex.pay() elif num ==3: alex.wear(futou) elif num ==4 : alex.attack_with_weapon(tendy) else : print('序列号有误')