py5.25
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# 一个类的对象.新属性名 = 另一个类的对象 # 另一个类的对象.方法 = 一个类的对象的.新属性名.方法 # class Weapon: # def __init__(self,name,price,hp=0,ad=0): # self.name = name # self.price = price # self.hp = hp # self.ad = ad # def kill(self,dog): # dog.hp -= self.ad # # 板儿砖 = Weapon('打狗砖',198,190) # alex.weapon = 板儿砖 # alex.weapon.kill(taibai) #学生和课程 # class Student: # def __init__(self,name,sex,age,phone,course): #将课程的对象用参数传进来。 # self.name = name # self.sex = sex # self.age = age # self.phone = phone # self.money = 0 # self.course = course #直接将课程作为学生的属性。 # # class Project: # def __init__(self,name,period,price): # self.name = name # self.period = period # self.price = price # English = Project('英语',6,60) # math= Project('数学',10,100) # ming = Student('张三','男',18,188,English) #将课程的对象课程名称传给学生类中作为学生对象小明的属性。 # hong = Student('小红','女',17,160,math) # print(ming.course.price) # print(hong.course.name,hong.course.price) #圆环与圆 #圆的类 # class circle: # def __init__(self,r): # self.r = r # # def perimiter(self): # return 2*3.14*self.r #创建对象的时候直接将半径传入,此处直接用即可,用self.r # # def area(self): # return 3.14*self.r**2 # # #圆环的类 # class ring: # def __init__(self,out_r,in_r): # self.out_r = circle(out_r) #将圆函数中的对象作为属性返回来。 # self.in_r = circle(in_r) # # def perimiter(self): # return self.out_r.perimiter() +self.in_r.perimiter() #在此用返回来的属性来调用圆中的方法。 # # def area(self): # return self.out_r.area() - self.in_r.area() # # obj = ring(10,5) #创建对象 # print(obj.area()) #调用方法。 # 抽象类和接口类都不能被实例化,约束了一种规范。其它所有类用这种方法时都要依照这种规范。 #组合:一个类中的对象被当做另一个类中对象的属性。 #给人加一个装备,加一个装备的类: # class Person: # def __init__(self,name,sex,hp,ad): # self.name =name # self.sex = sex # self.hp = hp # self.ad = ad # self.money = 0吗 #money属性可以在方法中直接定义一个初始值0 # def attack(self,dog): # dog.hp -= self.ad # # def recharge(self,money): #充值函数,如果余额不足调用这个函数充值 # self.money += money # # def buy_weapon(self,thing): #买装备函数,如果想用装备,则调用这个函数,按指示执行。 # if self.money >= thing.price: # self.money -= thing.price # self.weapon = wp #如果购买成功,则将武器中的‘咒术典籍’对象当做一个属性赋予给alex。 # #这样alex可以在攻击力不够的情况下利用这个‘咒术典籍’属性(武器中的一个对象)来调用武器中的kill方法。 # thing.total_ad += self.ad #在次可以将武器的攻击力加上人的攻击力赋予给原武器的攻击力值。 # print('已经成功购买%s装备!' % thing.name) # else: # print('余额不足请充值') # # class Dog: # def __init__(self,name,kind,hp,ad): # self.name = name # self.kind = kind # self.hp = hp # self.ad = ad # def bite(self,person): # if person.hp <= self.ad: # person.hp = 0 # else: # person.hp -= self.ad # # class Weapon: # def __init__(self,name,price,ad=0,hp=0): # self.name = name # self.price = price # self.hp = hp # self.total_ad = ad # def kill(self,dog): # if dog.hp <= self.total_ad: #如果武器被购买,则这里的攻击值变成了购买者的攻击值加上武器本身的攻击值。 # dog.hp = 0 # else: # dog.hp -= self.total_ad # # alex = Person('alex',None,50,1) # taibai = Dog('taibai',None,190,50) # wp = Weapon('咒术典籍',998,180) # alex.buy_weapon(wp) #先购买装备,提示余额不足。 # alex.recharge(1000) #调用充值函数。 # alex.buy_weapon(wp) #再次购买并购买成功。 # alex.attack(taibai) #alex先不用武器攻击了一下taibai. # alex.weapon.kill(taibai) #然后带上武器又一起攻击了一下。 # print(taibai.hp) #最后查看taibai的血量值。 #类的继承: #为了避免代码的重复性,子类中共有的属性可以只在父类中定义即可,子类中照样正常传值,只不过不用定义了。 #子类中独有,父类中没有的属性:派生属性 #子类中独有,父类中没有的方法:派生方法 #子类中使用父类中定义的属性; # 指名道姓:父类名.__init__(self,参数) # 简化方法:super().__init__(参数) #子类中调用父类中的同名方法: # 如果子类中不存在:子类的对象.函数/方法名 # 如果子类中存在: surper().函数/方法名。 如果此处直接用对象名,则会找子类自己的方法,不会找父类。 # class Role: # def __init__(self,name,hp,ad): # self.name = name # self.hp = hp # self.ad = ad # def func(self): # print('父类') # # class Person(Role): # def __init__(self,name,sex,hp,ad): # self.sex = sex # # Role.__init__(self,name,hp,ad) #指名道姓方法,需要自己将self参数传进去,还有其它需要用到父类中定义的属性 # super(Person, self).__init__(name,hp,ad) #不需要自己传参self. # #括号中的可省略,super().__init__(name,hp,ad) # # self.func() #对象名直接调用,先找自己的方法,如果没有再找父类中的方法。 # super().func() #想用父类中的方法,用super().方法名 # def func(self): # print('子类') # alex = Person('alex','男',500,1) # print(alex.name)