面向对象的三大特性:继承 多态 封装
面向对象的组合用法
软件重用的重要方式除了继承之外还有另外一种方式,即:组合
组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合
1 class Dog: 2 def __init__(self,name,aggr,hp,kind): 3 self.name = name 4 self.aggr = aggr 5 self.hp = hp 6 self.kind = kind 7 def bite(self,person): 8 person.hp -= self.aggr 9 10 class Person: 11 def __init__(self,name,aggr,hp,sex): 12 self.name = name 13 self.aggr = aggr 14 self.hp = hp 15 self.kind = sex 16 self.money = 0 17 def attack(self,dog): 18 dog.hp -= self.aggr 19 def get_weapon(self,weapon): # 获得武器的方法 20 if self.money >= weapon.price: 21 self.money -= weapon.price 22 self.weapon = weapon 23 self.aggr += weapon.aggr 24 else: 25 print('余额不足,请先充值') 26 27 class Weapon: # 定义了一个武器类 28 def __init__(self,name,aggr,njd,price): 29 self.name = name # 武器名 30 self.aggr = aggr # 武器攻击力 31 self.njd = njd # 耐久度 32 self.price = price # 价格 33 def dragon18(self,person): # 武器终极技能 降龙十八掌 34 if self.njd > 0: 35 person.hp -= self.aggr * 2 36 self.njd -= 1 37 38 39 alex = Person('alex',5,100,'不详') 40 jin = Dog('金老板',100,500,'teddy') 41 w = Weapon('打狗棒',100,3,998) 42 # 给Alex装备打狗棒 怎么装 43 # 装备 44 # 伤害 45 # 血量 46 alex.money += 1000 47 alex.get_weapon(w) 48 print(alex.money) # 买了武器1000-998=2 49 print(alex.weapon) # <__main__.Weapon object at 0x0000000001F46198> 50 print(alex.aggr) # 5 +100 =105 拿上武器后的攻击力 51 52 #alex.attack(jin) 53 #print(jin.hp) # 500-105= 395 54 alex.weapon.dragon18(jin) # 用了武器的大招 100攻击力*2 55 print(alex.aggr) 56 print(jin.hp) # 395 - 100*2 =195
1 from math import pi 2 3 class Circle: 4 ''' 5 定义了一个圆形类; 6 提供计算面积(area)和周长(perimeter)的方法 7 ''' 8 def __init__(self,radius): 9 self.radius = radius 10 11 def area(self): 12 return pi * self.radius * self.radius 13 14 def perimeter(self): 15 return 2 * pi *self.radius 16 17 18 circle = Circle(10) #实例化一个圆 19 area1 = circle.area() #计算圆面积 20 per1 = circle.perimeter() #计算圆周长 21 print(area1,per1) #打印圆面积和周长 22 23 class Ring: 24 ''' 25 定义了一个圆环类 26 提供圆环的面积和周长的方法 27 ''' 28 def __init__(self,radius_outside,radius_inside): 29 self.outsid_circle = Circle(radius_outside) 30 self.inside_circle = Circle(radius_inside) 31 32 def area(self): 33 return self.outsid_circle.area() - self.inside_circle.area() 34 35 def perimeter(self): 36 return self.outsid_circle.perimeter() + self.inside_circle.perimeter() 37 38 39 ring = Ring(10,5) #实例化一个环形 40 print(ring.perimeter()) #计算环形的周长 41 print(ring.area()) #计算环形的面积
用组合的方式建立了类与组合的类之间的关系,它是一种‘有’的关系,比如教授有生日,教授教python课程
1 class Birthday: 2 def __init__(self,year,month,day): 3 self.year = year 4 self.month = month 5 self.day = day 6 class Course: 7 language = 'Chinese' 8 def __init__(self,teacher,course_name,cycle,price): 9 self.teacher = teacher 10 self.name = course_name 11 self.cycle = cycle 12 self.price = price 13 def func(self): 14 pass 15 class Teacher: 16 def __init__(self,name,age,sex,birthday,): 17 self.name = name 18 self.age = age 19 self.sex = sex 20 self.birthday = birthday 21 self.course = Course(self,'python',6,20000) 22 b = Birthday(2018,1,16) 23 egg = Teacher('egon',0,'女',b) 24 print(egg.birthday.year) 25 print(egg.birthday.month) 26 print(egg.course.price)