一、封装数据属性、明确区分内外:示例代码如下:
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
调用者不关心后面的计算方式,只关心房间面积,如果要求体积,只需更改下公式,用户调用不用发生改变