o3_封装,一个对象的属性,为另外一个对象.py

对象作为属性赋值给另外一个对象,

 1 #  Learner BM
 2 """
 3 士兵突击(一个对象的属性,可以是另一个对象)
 4         达到什么结果??
 5 
 6 Solider类
 7     属性 :
 8         name:='ak'
 9         gun=(另一个类创建的对象)
10     方法:
11         初始化方法
12         fire方法
13 
14 Gun类
15     属性:
16         model 型号
17         bull_count  子弹
18     方法:
19         初始化方法
20         装填子弹(count)子弹计数,判断子弹
21         发射方法shoot
22 哪个类要被使用,先开发那个类,本案例Gun类要被Solider使用,所以先开发Gun类
23 
24 许三多的gun属性为gun类的实例实例名为ak47,实现许三多对象访问ak47对象的所有属性和方法
25 
26 """
27 # 定义Gun类
28 class Gun():
29     #  初始化方法
30     def __init__(self,model,bull_count,):
31         #  枪的型号
32         self.model = model
33         #  枪的子弹数量,初始化
34         self.bull_count = bull_count
35 
36     #  装填子弹方法
37     def add_bull(self):
38         #  每次装填10个子弹
39         print('枪有%s个子弹,装填了%s个子弹'%(self.bull_count,10))
40         self.bull_count +=10
41 
42     #  发射子弹方法
43     def shoot(self):
44         #  每次发射减少5个子弹
45         self.bull_count -=5
46         print('发射子弹,子弹减少了%s个,还剩余%s个子弹' %(5,self.bull_count))
47 class Soldier():
48     #  初始化方法
49     def __init__(self,name):
50         self.name = name
51         # 属性若为初始值需待定,可以设置None
52         self.gun = None
53     #  开火方法
54     def fire(self):
55         print('发射子弹')
56         #  访问到gun的属性好方法
57         print(xusanduo.gun.bull_count)
58         #  调用gun对象的装填子弹方法
59         xusanduo.gun.add_bull()
60         #  调用gun对象的发射方法
61         xusanduo.gun.shoot()
62 
63     def move(self):
64         print('我在移动拿着%s移动' % xusanduo.gun.model )
65 
66 #  创建实例枪
67 ak47 = Gun('Ak47',10)
68 #ak47.add_bull()
69 #ak47.shoot()
70 #  创建士兵的实例
71 xusanduo = Soldier('许三多')
72 #  许三多的gun属性为gun类的实例实例名为ak47,实现许三多对象访问ak47对象的所有属性和方法
73 xusanduo.gun = ak47
74 xusanduo.move()
75 #  通过调用士兵的fire方法,实现扩展到调用gun的属性好方法
76 xusanduo.fire()
77 
78 
79 #print(xusanduo.gun.model)
View Code

 o4_封装里是私有属性和私有方法.py

 1 #  Learner BM
 2 """
 3 既然一个类的对象(实例)可以作为参数,以及作为属性传递,赋值给另外一个对象(实例),实现方法和属性的跨类调用,
 4 如果什么属性和方法都能被其他类跨类调用数据安全得不到保障,这时候就需要对类中的属性或方法作出限制,
 5 使得类内部中部分数据让外界无法访问,此时就需要用到 私有属性和私有方法  (属性和方法名前加上 '__' 双下划线)
 6 
 7 属性和方法一旦被私有化后,只能在类的内部访问,外界无法访问
 8 
 9 私有属性的定义
10  __age = 28
11 
12 私有属性的访问(因为只能在对象的内部访问,所以使用self关键字)
13 self.__age
14 """
15 
16 #  定义一个女人类
17 class Women():
18     def __init__(self,name):
19         self.name =name
20         #  私有属性,仅在对象内部能够被访问,外界无法访问
21         self.__age = 18
22         self.weight = 45
23 
24     def womenInfo(self):
25         #  私有属性__age,访问时也需要加上'__',只能在对象内部进行操作
26         return print('%s的体重是%s,年龄是%s' %(self.name,self.__age,self.weight) )
27 
28 #  定义一个男人类
29 class Men():
30     def __init__(self,name):
31         self.name =name
32 
33     def love(self,women):
34         print('%s喜欢的对象名字叫做%s' % (self.name,women.name))
35         # __age书屋women对象的私有属性,无法直接访问,可以通过调用womeninfo方法间接访问
36         # print('%s的年龄是' % (women.__age))
37         print('%s的的体重是%s' % (women.name,women.weight))
38 #  创建女人对象
39 xiaomei=Women('小美')
40 #  外界访问小美的私有年龄方法,无法执行
41 #  (xiaomei.__age)
42 print('类外界访问私有属性输出的小美的年龄,不建议使用' ,xiaomei._Women__age)
43 #  调用女人身份信息的方法
44 #xiaomei.womenInfo()
45 #  创建男人
46 xiaoming =Men('小明')
47 #  调用男人的love方法,传入女人对象xiaomei,使love方法内部能够访问women的属性和方法,
48 #  但是由于__age属于私有属性,无法访问
49 xiaoming.love(xiaomei)
50 
51 """
52 python中没有真正意义的私有,
53 开发中,私有属性和私有方法不要轻易访问
54 对象._类名__(属性或者方法)
55 对象._Women__age,参见
56 """
View Code

 

posted on 2020-03-08 21:27  RRRRRRR1  阅读(8)  评论(0)    收藏  举报