当前位置 : 主页 > 手机开发 > 其它 >

7.26 面向对象_封装_property_接口

来源:互联网 收集:自由互联 发布时间:2021-06-19
封装 封装 就是隐藏内部实现细节, 将复杂的,丑陋的,隐私的细节隐藏到内部,对外提供简单的访问接口 为什么要封装 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()  # 超过大小限制,所以提示内存超过限制
# 内存超过限制!

好处:通过封装的方法来修改、读取、删除(私有)属性,可以在对属性进行修改、读取、删除的时候可以做拦截,做一些逻辑操作

缺点:访问的时候,访问方式不统一,非私有变量直接 # 对象.属性名 就可以访问了,而私有变量因为用了方法封装才能访问,所以访问的时候要调用方法才行

网友评论