zoukankan      html  css  js  c++  java
  • 封装

    1.封装

      对外隐藏内部实现细节,并提供访问接口

      封装是为了保证关键数据的安全性.  对外部隐藏实现细节,隔离复杂度

      什么时候应该封装: 当有一些数据不希望外界直接修改时,当有一些函数不希望给外界使用时

    python中只有两种权限

      公开的,默认公用,   私有的,只能由当前类使用

    在外界访问私有的内容

      属性虽然被封装了,但是仍需要使用,在外界访问通常定义方法类完成私有属性的修改和访问

    # 被封装的内容外界不能直接访问, 内部依旧可以使用
    class
    Person: def __init__(self,id_number,name,age): self.__id_number= id_number # 设置隐藏属性时,将属性名前加__ self.name = name self.age = age def show_id(self): print(self.__id_number) p = Person('1111','jack',20)
    print(p._Person__id_number) # 1111 隐藏到内部的实质是将属性名称前加_类名__ p.
    __id_number = '22' print(p.__id_number) # 22 p.show_id() # 1111

    封装函数属性实例

    class PC:
        def __init__(self,price,kind,color):
            self.price = price
            self.kind = kind
            self.color = color
        def open(self):
            print('接通电源')
            self.__check_device()
            print('载入内核')
            print('初始化内核')
            self.__start_services()
            print('启动GUI')
            self.__login()
        def __check_device(self):
             print('硬件检测1')
             print('硬件检测2')
             print('硬件检测3')
        def __start_services(self):
            print('启动服务1')
            print('启动服务2')
            print('启动服务3')
        def __login(self):
            print('login')
            print('login')
            print('login')
    pc1 = PC(2000,'香蕉','黄色')
    pc1.open()   
    #  接通电源
    硬件检测1
    硬件检测2
    硬件检测3
    载入内核
    初始化内核
    启动服务1
    启动服务2
    启动服务3
    启动GUI
    login
    login
    login
    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('开始下载')
            else:
                print('内存炸了')
        def set_buffer_size(self,size):
            if not type(size) == int:
                print('缓冲区为整形')
            else:
                print('缓冲区大小修改成功')
        def get_buffer_size(self):
            return self.__buffer_size
    d = Downloader('葫芦娃','http://www.baidu.com',1024*1024)
    d.set_buffer_size(1024*512)   # 缓冲区大小修改成功
    print(d.get_buffer_size())     # 524288
    print(d.filename)    # 葫芦娃
    d.start_download()   # 开始下载

    property 装饰器

      通过方法来修改或访问属性,使用者必须知道哪些是普通属性,哪些是私有属性,需要使用不同方法调用,  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):
            print('不允许删除该属性')
            del self.__key
    a = A('jack',123)
    print(a.key)  # 123
    a.key = 321   # key 必须小于等于100
    print(a.key)    # 123
    del a.key    # 不允许删除该属性

    有三个相关的装饰器

      @property    该装饰器用在获取属性的方法上

      @key.setter   该装饰器用在修改属性的方法上

      @key.deleter  该装饰器用在删除属性的方法上

    注意: key 是被property装饰方法的名称, 也是属性名称

      内部创建一个对象,变量名称就是函数名称,  所以在使用setter和deleter时,必须保证使用对象的名称去调用方法

    python 实现封装的原理

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

      封装: 对外部隐藏内部的实现细节. 并提供访问接口

      好处: 提高安全性    隔离复杂度

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

      访问被隐藏的属性, 提供用于访问或修改的方法, 使用property装饰器可以将一个方法伪装成普通的属性,保证属性之间方法一致

    封装的原理:  替换变量名称

    property 可以用来实现计算属性

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

    接口

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

      接口本质是一套协议标准,遵循这个标准的对象就能被调用, 接口目的就是为了提高扩展性

    class Mouse:
        def open(self):
            print('鼠标开机')
        def close(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)
    #鼠标开机
    获取光标位置
    鼠标不支持写入
    鼠标关机

      电脑提供USB接口,可以使用任何遵循USB接口协议的设备

    抽象类

      类中的方法是不具体, 这个类也是抽象的, 抽象类可以实现强制性要求子类必须实现父类声明的方法, 一个类是抽象类的子类,那么他必然实现了抽象类中的方法,对于使用者而言,只要知道抽象类中的方法,就可以无差别的使用这个抽象类的任何子类,大大降低了使用成本!

    abc 是abstract class单词的缩写, 翻译为抽象类
    抽象类的定义: 类中包含没有函数体的方法

    import abc
    class AClass(metaclass = abc.ABCMeta):
        @abc.abstractmethod
        def run(self):
            pass
        @abc.abstractmethod
        def run1(self):
            pass
    class B(AClass):
        def run(self):
            print('run')

    鸭子类型

      Python崇尚鸭子类型

    class Tex:
        def read(self):
            pass
        def write(self):
            pass
    class Disk:
        def read(self):
            pass
        def write(self):
            pass

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

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

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

    dayehui
  • 相关阅读:
    算法笔记--二分图判定
    算法笔记--最小表示法
    Codeforces 525A
    Codeforces 140D
    Codeforces C
    Codeforces 665C
    Codeforces 604B
    Codeforces 285C
    The Fewest Coins POJ
    Triangular Pastures POJ
  • 原文地址:https://www.cnblogs.com/zrh-960906/p/11251656.html
Copyright © 2011-2022 走看看