zoukankan      html  css  js  c++  java
  • Python面向对象04 /封装、多态、鸭子类型、类的约束、super

    Python面向对象04 /封装、多态、鸭子类型、类的约束、super

    1. 封装

    • 把一堆东西(代码,数据)放到一个地方(空间),并且可以使用,比如:函数,类

    2. 多态

    • 一个事物可以呈现多种形态 , 例如:水可以支持固态、液态、气态

    • Python默认支持多态(Java是强定义语言,Python是弱定义语言)

    • Python一个变量可以支持多种数据

    • 代码示例:

      python:
      	a = [1,2,3]
      	a = "abc"
      Java:
      	int a = 123
      

    3. 鸭子类型

    • Python崇尚鸭子类型(一种编程思路)

    • 看起来像鸭子就是鸭子类型

    • 将相似的功能,起同一名字,一种开发思路

    • 虽然A,B两个类没有关系,但是统一两个类中相似方法的方法名,在某种意义上是统一了一个标准

    • 优点:方便记忆,例如:str tuple list 都有 index方法,这就是统一了规范

    • 代码示例:

      class A:
          def login(self):
              print('登录')
          def register(self):
              print('注册')
          def func1(self):
              pass
          def func2(self):
              pass
      
      class B:
          def login(self):
              print('登录')
          def register(self):
              print('注册')
          def func3(self):
              pass
      
      # A B互为鸭子.
      

    4. 类的约束

    • python中对类的约束有两种:在父类主动抛出错误;接口类/抽象类

    • Python语言惯于使用的一种约束方式,在父类主动抛出错误

      提取⽗类. 然后在⽗类中定义好⽅法. 在这个⽅法中什么都不⽤⼲. 就抛⼀个异常就可以了. 这样所有的⼦类都必须重写这个⽅法. 否则. 访问的时候就会报错.

      代码示例:

      class Payment:
         """
         此类什么都不做,就是制定一个标准,谁继承我,必须定义我里面的方法。
         """
         def pay(self,money):
             raise Exception("你没有实现pay方法")
      
      class QQpay(Payment):
         def pay(self,money):
             print('使用qq支付%s元' % money)
      
      class Alipay(Payment):
         def pay(self,money):
             print('使用阿里支付%s元' % money)
      
      class Wechatpay(Payment):
         def fuqian(self,money):
             print('使用微信支付%s元' % money)
      
      def pay(obj,money):
         obj.pay(money)
      
      a = Alipay()
      b = QQpay()
      c = Wechatpay()
      pay(a,100)
      pay(b,200)
      pay(c,300)
      
    • 接口类/抽象类(借鉴于Java语言,定义抽象类的概念,做到真正的强制约束)

      使⽤元类来描述⽗类. 在元类中给出⼀个抽象⽅法. 这样⼦类就不得不给出抽象⽅法的具体实现. 也可以起到约束的效果

      代码示例:

      from abc import ABCMeta,abstractmethod
      class Payment(metaclass=ABCMeta):    # 抽象类 接口类  规范和约束  metaclass指定的是一个元类
          @abstractmethod
          def pay(self):pass  # 抽象方法
      
      class Alipay(Payment):
          def pay(self,money):
              print('使用支付宝支付了%s元'%money)
      
      class QQpay(Payment):
          def pay(self,money):
              print('使用qq支付了%s元'%money)
      
      class Wechatpay(Payment):
          # def pay(self,money):
          #     print('使用微信支付了%s元'%money)
          def recharge(self):pass
      
      def pay(a,money):
          a.pay(money)
      
      a = Alipay()
      a.pay(100)
      pay(a,100)    # 归一化设计:不管是哪一个类的对象,都调用同一个函数去完成相似的功能
      q = QQpay()
      q.pay(100)
      pay(q,100)
      w = Wechatpay()
      pay(w,100)   
      
      总结:
       - 抽象类在实例化的时候,没有抽象类里边的方法就用报错
       - 主动抛错,只有在用到类里边的方法才会报错
      
      
      # 抽象类和接口类做的事情 :建立规范
      # 制定一个类的metaclass是ABCMeta,
      # 那么这个类就变成了一个抽象类(接口类)
      # 这个类的主要功能就是建立一个规范
      

    5. super的深度剖析

    • super(类名,self)
      类名:要跳过的类,self指的是严格按照self对象从属类的mro的执行顺序去执行

    • 代码示例:

      class A:
          def f1(self):
              print('in A')
      class Foo(A):
          def f1(self):
              super().f1()
              print('in Foo')
      class Bar(A):
          def f1(self):
              print('in Bar')  # 1
      class Info(Foo,Bar):
          def f1(self):
              super(Foo,self).f1()
              print('in Info f1')  # 2
              
      obj = Info()
      obj.f1()
      
      #mro执行顺序:[Info Foo Bar A]
      # 结果:
      in Bar
      in Info f1
      
  • 相关阅读:
    vue 父子组件传参
    vue中引入swiper(vue中的滑块组件vue-awesome-swiper)
    border-radius值的解析
    chrome开发工具指南(十四)
    chrome开发工具指南(十三)
    Python动态强类型解释型语言
    go基础 01
    代码发布 04
    代码发布03
    代码发布02
  • 原文地址:https://www.cnblogs.com/liubing8/p/11321099.html
Copyright © 2011-2022 走看看