• day22


    封装

    什么是封装

    封装指的是隐蔽对象的属性和实现细节,仅对外公开接口,控制程序中属性的访问权限。

    为什么要封装

    对属性而言,封装就是为了限制属性的访问和修改,其目的就是为了保证关键数据的安全性。

    对封装方法而言,一个大的功能很多情况下是由很多个很小功能组合而成的,而这些内部的小功能对于用户而言是没有意义的,所以封装方法的目的就是为了,对外部隐藏实现细节 ,隔离复杂度。

    什么时候需要封装

    当有一些数据不希望外界直接修改时

    当一些函数不希望给外界使用时

    如何使用

    class Person
    	def __init__(self,id_number,name,age)
        	self.__id_number = id_number  #在前面加上双下划线
            self.name = name
            self.age = age
    p = Pewson("1111111111","panyi",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
    
        def start_download(self):
            if self.__buffer_size <=1024*1024:
                print("开始下载...")
                print('当前缓冲大小',self.__buffer_size)
            else:
                print('内存炸了')
        def set_buffer_size(self,size):
            if not type(size) == int:
                print('缓存必须是整型')
            else:
                print('缓冲区大小修改成功')
                self.__buffer_size = size
        def get_buffer_size(self):
            return self.__buffer_size
    d = Downloader('大头儿子','www.datouerzi.com','1024*1024')
    d.set_buffer_size(1024*1023)
    print(d.get_buffer_size())
    
            
    
    
    
    
    

    property装饰器

    通过方法来修改或访问属性 本身没有什么问题 但是这给对象的使用者带来了麻烦

    但是必须知道哪些是普通属性 哪些是私有属性 需要使用不同的方式来调用他们

    class A:
        def __init__(self,name,key):
            self.__name = name
            self.__key = key
    
        @property
        def key(self):
            return self.__key
        @key.setter
        def key(self,new_key):
            if new_key <= 100:
                self.__key = new_key
            else:
                print('key 必须小于等于100')
    
        @key.deleter
        def key(self,new_key):
            print('不允许删除')
            del self.__key
    
    a = A('jack',123)
    
    print(a.key)
    a.key = 1
    print(a.key)
    

    python实现封装的原理

    就是在加载类的时候,把__替换成了_类名__

    python 一般不会强制要求程序必须怎样怎样

    作用

    ​ property的作用是避免使用普通属性和私有属性时的方式发生变化。

    好处:

    ​ 1、提高安全性

    ​ 2、隔离复杂度

    语法

    将要封装的属性或方法名称前加双下划线

    访问被隐藏的属性:

    ​ 提供用于访问和修改的方法

    使用property装饰器可以将一个方法伪装成普通的属性 报纸属性之间调用方法一致,封装的实现原理,替代变量名称

    Property 可以用来实现计算属性

    计算属性指的是:属性的值,不能直接获得 必须通过计算才能获得

    列如:正方形求面积

    接口

    接口的定义

    ​ 接口是一组功能的集合 但是接口中仅包含功能的名字 不包含具体的实现代码

    接口本质

    ​ 是一套协议标准 遵循这个标准的对象就能被调用。

    接口的目的

    ​ 就是为了提高扩展性

    ​ 例如 电脑提前指定一套USB接口协议 只要你遵循该协议 你的设备就可以被电脑使用 不需要关心到底是鼠标还是键盘

    class USB:
        def open(self):
            pass
        def close(self):
            pass
        def read(self):
            pass
        def write(self):
            pass
    class Mouse(USB):
        def open(self):
            print('鼠标开机了....')
        def read(self):
            print('获取光标位置')
        def write(self):
            print('鼠标不支持写入')
    
    def pc(usb_device):
        usb_device.open()
        usb_device.read()
        usb_device.write()
        usb_device.close()
    m = Mouse()
    pc(m)
    
    class KeyBoard(USB):
        def open(self):
            print('键盘开机了....')
        def read(self):
            print('获取按键字符')
        def write(self):
            print('可以写入灯光颜色')
    
    k = KeyBoard()
    pc(k)
    
    
    
    class UDisk:
        def start(self):
            print('u盘启动了')
        def end(self):
            print('u盘关闭了')
        def write_data(self):
            print('写入数据')
    u = UDisk()
    pc(u)
    

    上述案列中,PC的代码一旦完成后,后期无论什么样的设备,只要遵循了USB接口协议,都能够被电脑所调用。

    接口主要是方便了对象的使用者 降低使用者的学习难度 只要学习一套使用方法 就可以以不变应万变

    抽象类

    指的是包含抽象方法(没有函数体的方法)的类

    作用

    作用 限制子类必须类中定义的抽象方法

    作用 : python 一般不会限制你必须怎么写 作为一个优秀的程序员 就必须自觉遵守相关协议

    接口是一套协议规范 明确子类们应该具备哪些功能

    抽象类是用于强制要求子类必须按照协议中规定的来实现

    然而 python不推崇你的语法 我们可以设计成鸭子类型 即让多个不同类对象具备相同的属性和方法 对于使用者而言 就可以以不变应万变 轻松

  • 相关阅读:
    链表10-开发可用链表(使用链表)
    LRU简单实现
    图片服务器搭建过程
    scp
    dubbo-admin无法访问
    linux tomcat启动后无法访问
    linux进程端口防火墙
    centos7 jdk
    com.alibaba.dubbo.rpc.RpcException: Fail to start server(url: dubbo://192.16。。
    linux与Unix切换到root用户
  • 原文地址:https://www.cnblogs.com/panyi2019/p/11252712.html
Copyright © 2020-2023  润新知