• 封装,接口,抽象


    去幕布看>>

    • 封装
      • 定义
        就是将复杂的丑陋的,隐私的细节隐藏到内部,其他程序无法调用,使​私有化,
        但是​可以在内部定义方法,外部调用这个方法的方式来使用被封装的方法和属性
      • 好处
        1.为了保证 关键数据的安全性
        2.对外部隐藏实现细节,隔离复杂度
      • 语法
        在属性名前添加两个下划线__,将其设置为私有的即可
      • 原理
        1.其实这仅仅这是一种变形操作且仅仅只在类定义阶段发生变形
        (就是说通过__dict__方法查看显示的还是__属性名,并不是_类名__属性名);
        2.类中所有双下划线开头的名称如__x都会在类定义时自动变形成:_类名__x的形式,并没有真正阻止外部的访问
        3.在继承中,父类如果不想让子类覆盖自己的方法,可以将方法定义为私有的
      • 权限问题
        在python只要两种权限:
        1.公开的.默认就是公开的
        2.私有的,只能由当前类自己使用
    • 访问私有属性的方法(property装饰器)
      • 如何理解
        其实就是通过property的get,set,delete实现了:​
        将对象名.方法(参数) 改为了对象名.属性名 = 参数的形式
      • 相关的三个装饰器
        1.property   该装器用在获取属性的方法上 
        2.@key.setter  该装器用在修改属性的方法上 
        3.@key.deleter 该装器用在删除属性的方法上 
        注意:key是被property装饰的方法的名称 也就是属性的名称 内部会创建一个对象,变量名称就是函数名称  
        所以在使用setter和deleter时 必须保证使用对象的名称取调用方法 所以是 key.setter
      • 案例
        # 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)
        a.key = 321
        print(a.key)
    • 计算属性
      • 如何理解
        就是property方法的一个应用
      • 案例
        # 计算属性案例
        
        class Square:
            def __init__(self,width):
                self.width = width
                # self.area = self.width * self.width
            @property
            def area(self):
                return self.width * self.width
        
        s = Square(10)
        print(s.area)
        
        
        '''执行结果
        100
        '''
    • 接口
      • 定义
        继承的一种特殊情况​
        接口是一组功能的集合,但是接口中仅包含功能的名字,不包含具体的实现代码
        接口是一套协议规范,明确子类们应该具备哪些功能​接口本质是一套协议标准,遵循这个标准的对象就能被调用
      • 目的
        提高扩展性例如 电脑提前指定制定一套USB接口协议,
        只要你遵循该协议,你的设备就可以被电脑使用,
        不需要关心到底是鼠标还是键盘 ​
      • 案例
        # 接口案例
        
        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)
        
        
        '''执行结果
        
        鼠标开机.....
        获取了光标位置....
        鼠标不支持写入....
        鼠标关机了...
        
        '''
      • 案例理解
        PC的代码一旦完成,后期无论什么样的设备,只要遵循了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("runrunrurn...")
        
        b = B()
    • 鸭子类型
      • 定义
        抽象类是用于强制要求子类必须按照协议中规定的来实现
        然而,python不推崇限制你的语法, 我们可以设计成鸭子类型,既让多个不同类对象具备相同的属性和方法
      • 好处
        对于使用者而言,就可以以不变应万变,轻松的使用各种对象
  • 相关阅读:
    根据屏幕大小,加载不同大小的图片
    规范命名CSS
    iframe框架加载完成后执行函数
    js获取IP地址
    80端口被System占用 造成Apache不能启动的解方案
    自定义一个仿Spinner
    让你的代码量减少3倍!使用kotlin开发Android(一)
    屏幕适配
    一个旋转菜单
    手势监听GestureDetector 案例
  • 原文地址:https://www.cnblogs.com/buzaiyicheng/p/11256808.html
Copyright © 2020-2023  润新知