面向对象之封装
一.什么是封装
封装就是将复杂的丑陋的,隐私的细节隐藏到内部,对外提供简单的使用接口
对外隐藏内部实现细节,并提供访问的接口
二.为什么需要封装
1.为了保证关键数据的安全性
2.对外部隐藏实现细节,隔离复杂度
三.什么时候应该封装
1.当有一些数据不希望外界可以直接修改时,
2.当有一些函数不希望给外界使用时
四.如何使用:
1 class Person: 2 def __init__(self,id_number,name,age): 3 self.__id_number = id_number 4 self.name = name 5 self.age = age 6 p = Person('32030219961011002500','jack',18)
这里的id_number这个属性就被封装了,外界不可调用和查询,只能在类内部使用
1.被封装的内容的特点
1.外界不能直接访问
2.内部依然可以使用
2.权限:
学习了封装后就可以控制属性的权限在Python只要两种权限:
1.公开的,默认就是公开的
2.私有的,只能由当前类自己使用
案例:封装类中的方法,为了隔离复杂度
1 class PC: 2 3 def __init__(self,price,kind,color): 4 self.price = price 5 self.kind = kind 6 self.color = color 7 8 def open(self): 9 print('接通电源') 10 self.__check_device() 11 print('载入内核') 12 print('初始化内核') 13 self.__start() 14 print('启动GUI') 15 self.__login() 16 def __check_device(self): 17 print("硬件检测") 18 print("硬件检测") 19 print("硬件检测") 20 print("硬件检测") 21 print("硬件检测") 22 23 def __start(self): 24 print('启动服务') 25 print('启动服务') 26 print('启动服务') 27 print('启动服务') 28 print('启动服务') 29 30 def __login(self): 31 print('login') 32 print('login') 33 print('login') 34 pc1 = PC(2000,'apple','blue') 35 pc1.open()
五.在外界访问私有的内容
属性虽然被封装了,但是还是需要使用,在外界如何访问,通过定义方法类完成对私有属性的修改和访问
案例:
1 class Downloader: 2 def __init__(self,filename,url,buffer_size): 3 self.filename = filename 4 self.url = url 5 self.__buffer_size = buffer_size 6 7 def start_download(self): 8 if self.__buffer_size <= 1024*1024: 9 print('开始下载...') 10 print('当前缓冲器大小:'self.__buffer_size) 11 else: 12 print('内存炸了!') 13 14 def set_buffer_size(self,size): 15 if not type(size) == int: 16 print('大哥 缓冲器必须是整形') 17 else: 18 print('缓冲区大小修改成功!') 19 self.__buffer_size = size 20 21 def get_buffer_size(self): 22 return self.__buffre_size 23 24 d = Downloader('葫芦娃','http://www.huluwa.com',1024*1024) 25 26 #通过调用函数修改内部封装的属性 27 d.set_buffer_size(1024*512) 28 29 #通过调用函数访问内部封装的属性 30 print(d.get_buffer_size()) 31 32 d.start_download()
六.property装饰器
通过方法来修改或访问属性,本身没什么问题,但是这样给对象的使用者带来了不方便,使用必须知道那些是普通属性,哪些是私有属性,需要使用不同的方式来调用他们,property装饰器就是为了使得调用方式一致
下面有三个相关的装饰器:
1 1.@property 用在获取属性的方法上 2 2.@key.setter 用在修改属性的方法上 3 3.@key.deleter 用在删除属性的方法上
案例:
1 class A: 2 def __init__(self,name,key): 3 self.__name__=name 4 self.key = key 5 6 @property 7 def key(self): 8 return self.__key 9 10 @key.setter 11 def key(self,new_key): 12 if new_key <= 100: 13 self.__key = new_key 14 else: 15 print('key必须小于等于100') 16 17 @key.deleter 18 def key(self): 19 print("不允许删除该属性") 20 del self.__key 21 22 a = A('jack',123) 23 print(a.key) 24 a.key = 321 25 print(a.key)
python实现封装的原理:
就是在加载类的时候,把__替换成了_类名__ 例如将__name 替换成了 _A__name
封装就是对外部隐藏内部的实现细节,并提供访问的接口
好处:
1.提高安全性
2.隔离复杂度
访问被隐藏的属性:
提供用于访问和修改的方法
使用property装饰器可以将一个方法伪装成普通属性,属性之间的调用方法是一致的
property可以用来实现计算属性
计算属性指的是:属性的值,不能直接获得,必须通过计算才能获取
案例:
class Square: def __init__(self,width): self.width = width @property def area(self): return self.width*self.width s = Square(10) print(s.area) s.width = 20 print(s.area) s.width =2 print(s.area)
万般皆下品,唯有读书高!