封装 封装 就是隐藏内部实现细节, 将复杂的,丑陋的,隐私的细节隐藏到内部,对外提供简单的访问接口 为什么要封装 1.保证关键数据的安全性 2.对外部隐藏实现细节,隔离复杂度 什么时候
封装
封装 就是隐藏内部实现细节,
将复杂的,丑陋的,隐私的细节隐藏到内部,对外提供简单的访问接口
为什么要封装
1.保证关键数据的安全性
2.对外部隐藏实现细节,隔离复杂度
什么时候应该封装
1.当有一些数据不希望外界可以直接修改时
2.当有一些函数不希望给外界使用时
如何使用封装
语法:
class Person: def __init__(self,id_number,name,age) self.__id_number = id_number # 比如这里是比较重要的身份证号码,不能随便调用 # 给属性或者方法前面加上 __ def show_id(self): print(self.__id_number) def __say_hi(self): print(f"hi, 我是{self.name}") p = Person('35676549809711', 'bitten', 29) p.id_number = '3756789' # 这里其实是给对象加了个属性 id_number(对象属性的增删改查) print(p.id_number) # 222 p.show_id() # 111111111111111111 # 并没有受到影响 # p.__id_number # 报错,pycharm没有提示也找不到,AttributeError: 'Person' object has no attribute '__id_number' # p.__say_hi # 报错,AttributeError: 'Person' object has no attribute '__say_hi'双下划线,外界就访问不到了 self.name = name self.age = age p = Person("1111111111111","jack",29) p.id_number = "222"
被封装的内容的特点:
1.外界不能直接访问
2.内部依然可以使用
权限
利用好封装的特性就可以控制属性的权限(接着往下看)
python中只有两种权限
1.公开的属性或方法,默认就是公开的
2.私有的属性或方法,只能由当前类自己使用
在外界访问私有的内容
属性虽然被封装了,但是还是需要使用的
在外界访问私有属性的方法就是:
通过定义方法类完成对私有属性的修改和访问
''' 这是一个下载器类,需要提供一个缓存大小这样的属性 缓存大小不能超过内存限制 ''' class Downloader: def __init__(self, filename, url, buffer_size): self.filename = filename self.url = url # self.buffer_size = buffer_size self.__buffer_size = buffer_size # 一旦被私有后,外界就无法直接访问了,应该给外界提供一个接口,可以改动 def start_download(self): # if self.buffer_size <= 1024*1024: if self.__buffer_size <= 1024*1024: print("开始下载...") else: print("内存超过限制!") # 可以在方法中添加一些额外的逻辑 def set_buffer_size(self, size): # 这里可以加一些限制操作,限制大小或者登录验证,数据校验 if not isinstance(size, int): print("缓冲区大小必须是整数!") return False self.__buffer_size = size def get_buffer_size(self): return self.__buffer_size d = Downloader("冰火两重天", 'https://www.baidu.com', 1024*1024) # d.buffer_size = 1024*1024*1024 d.start_download() # 开始下载... d.set_buffer_size(1024 * 512) # 外界通过方法改动私有属性 d.set_buffer_size('aa') # 外界通过方法改动私有属性 # 缓冲区大小必须是整数! d.start_download() # 开始下载... print(d.get_buffer_size()) # 外界通过方法访问私有属性 # 524288 d.set_buffer_size(1024 * 1024 * 1024 / 2) # 这里 / 2 变成了float 浮点型,类型不匹配了 # 缓冲区大小必须是整数! d.start_download() # 开始下载... # 这里用的是之前的buffer_size,上面没有改成功(不然超出大小了也下不了的) d.set_buffer_size(1024 * 1024 * 1024) # set_buffer_size() 里没有做大小限制,所以其实是改成功了 d.start_download() # 超过大小限制,所以提示内存超过限制 # 内存超过限制!
好处:通过封装的方法来修改、读取、删除(私有)属性,可以在对属性进行修改、读取、删除的时候可以做拦截,做一些逻辑操作
缺点:访问的时候,访问方式不统一,非私有变量直接 # 对象.属性名
就可以访问了,而私有变量因为用了方法封装才能访问,所以访问的时候要调用方法才行