组合的用法

面向对象的三大特性:继承 多态 封装

面向对象的组合用法

软件重用的重要方式除了继承之外还有另外一种方式,即:组合

组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合

 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)

猜你喜欢

转载自www.cnblogs.com/ys-python/p/10618461.html
今日推荐