# 一个类的对象.新属性名 = 另一个类的对象
# 另一个类的对象.方法 = 一个类的对象的.新属性名.方法
# 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)