Python----面向对象---封装的意义

一、封装数据属性、明确区分内外:示例代码如下:

 1 class People:
 2     def __init__(self, name, age):
 3         self.__name = name
 4         self.__age = age
 5 
 6     def tell_info(self):
 7         print('Name:<%s> Age<%s>' % (self.__name, self.__age))
 8 
 9 p = People('egon', 18)
10 p.tell_info()
11 
12 结果为:
13 Name:<egon> Age<18>

可以防止外部直接修改隐藏属性,并且提供了一个接口,按照固定的格式向调用者输出信息

也可以提供修改隐藏属性的接口,让调用者通过接口修改隐藏的属性,并且可以写上控制逻辑

例如:

 1     def set_info(self, name, age):
 2         if not isinstance(name, str):
 3             print('名字必须是字符串类型')
 4             return
 5         if not isinstance(age, int):
 6             print('年龄必须是数字类型')
 7             return
 8         self.__name = name
 9         self.__age = age
10 
11 
12 p = People('egon', 18)
13 # p.tell_info()
14 
15 p.set_info('EGON', 18)
16 p.tell_info()
17 
18 结果为:
19 
20 Name:<EGON> Age<18>

可以看出,修改成功了,并且加上了控制,不让调用者随意更改

二、隔离复杂度

例如:

 1 class ATM:
 2     def __card(self):
 3         print('插卡')
 4 
 5     def __auth(self):
 6         print('用户认证')
 7 
 8     def __input(self):
 9         print('输入取款金额')
10 
11     def __print_bill(self):
12         print('打印账单')
13 
14     def __take_money(self):
15         print('取款')
16 
17     def withdraw(self):
18         self.__card()
19         self.__auth()
20         self.__input()
21         self.__print_bill()
22         self.__take_money()
23 
24 a = ATM()
25 a.withdraw()
26 
27 结果为:
28 
29 插卡
30 用户认证
31 输入取款金额
32 打印账单
33 取款

用户只关注取款,至于里面怎么实现,用户并不关注

三、扩展性高

一个求房间面积的例子,如下:

 1 class Room:
 2     def __init__(self, name, owner, weight, length):
 3         self.name = name
 4         self.owner = owner
 5 
 6         self.__weight = weight
 7         self.__length = length
 8 
 9     def tell_area(self):
10         return self.__weight * self.__length
11 
12 r = Room('卫生间', 'alex', 10, 10)
13 print(r.tell_area())
14 
15 结果为:
16 100

调用者不关心后面的计算方式,只关心房间面积,如果要求体积,只需更改下公式,用户调用不用发生改变

 

posted @ 2018-03-21 21:18  xudachen  阅读(1246)  评论(0编辑  收藏  举报