封装 封装 就是隐藏内部实现细节, 将复杂的,丑陋的,隐私的细节隐藏到内部,对外提供简单的访问接口 为什么要封装 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() # 超过大小限制,所以提示内存超过限制
# 内存超过限制!
好处:通过封装的方法来修改、读取、删除(私有)属性,可以在对属性进行修改、读取、删除的时候可以做拦截,做一些逻辑操作
缺点:访问的时候,访问方式不统一,非私有变量直接 # 对象.属性名 就可以访问了,而私有变量因为用了方法封装才能访问,所以访问的时候要调用方法才行
