封装,接口,抽象

去幕布看>>

  • 封装
    • 定义
      就是将复杂的丑陋的,隐私的细节隐藏到内部,其他程序无法调用,使​私有化,
      但是​可以在内部定义方法,外部调用这个方法的方式来使用被封装的方法和属性
    • 好处
      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不推崇限制你的语法, 我们可以设计成鸭子类型,既让多个不同类对象具备相同的属性和方法
    • 好处
      对于使用者而言,就可以以不变应万变,轻松的使用各种对象

 

posted @ 2019-07-27 21:25  不在一城  阅读(131)  评论(0编辑  收藏  举报