zoukankan      html  css  js  c++  java
  • 封装与多态

    1. 封装、多态

    封装:将代码、数据放入一个容器空间中,并且可以使用.

    多态:一个事物可以呈现多种形态。

    python默认支持多态,一个变量可以指向多种数据类型。

    2. 鸭子类型--Duck typing

    python崇尚鸭子类型(编码思路)。

    "鸭子类型"像多态一样工作,但是没有继承。

    看起来像“鸭子”,其实就是“鸭子”;
    	定义:A、B类没有耦合性,但A、B类里面具有相同的方法,则称A、B互为“鸭子”,在某种意义上统一了标准。
    	虽然A、B两个类没有关系,但是统一两个类中相似方法的方法名,在某种意义上统一了标准。
    	例如:字符串、列表、元组的index方法,名字相同,作用相似,但不是一个index。
    

    3. 类的约束

    # 方法一:python语言惯于使用的一种约束方式,在父类主动抛出错误
    # raise Exception("主动报错"),放在父类中,前提是已制定了相应的规则
    
    class Payment:
        def pay(self,money):
            raise Exception("子类要使用pay方法")   # 主动抛出约束错误,如果子类不使用pay方法,报错
    
    class QQpay(Payment):		# 鸭子类型
    
        def pay(self, money):
            print(f"使用qq支付了{money}")
    
    class Alipay(Payment):
    
        def pay(self, money):
            print(f"使用阿里支付{money}")
    
    class Wechat(Payment):
    
        def pay(self, money):
    #    def zhifu(self,money):     # 会报错
            print(f"使用微信支付{money}")
    
    
    def pay(obj, money):
        obj.pay(money)       # 归一化设计:统一接口
    
    
    obj1 = QQpay()
    obj2 = Alipay()
    obj3 = Wechat()
    
    pay(obj1, 100)
    pay(obj2, 200)
    pay(obj3, 300)
    
    
    # 方法二:借鉴于Java语言,定义抽象类的概念,做到真正的强制约束
    # 抽象类、接口类:强制在父类指定规则、规范
    
    from abc import ABCMeta, abstractmethod
    
    class Payment(metaclass=ABCMeta):
        @abstractmethod        # 强制约束错误,当实例化对象时,子类没有pay方法就会报错
        def pay(self,money):
            pass
    
    class QQpay(Payment):		# 鸭子类型
    
        def pay(self, money):
            print(f"使用qq支付了{money}")
    
    class Alipay(Payment):
    
        def pay(self, money):
            print(f"使用阿里支付{money}")
    
    class Wechat(Payment):
    
        def pay(self, money):    # 当没有pay时会报错
            print(f"使用微信支付{money}")
    
    
    def pay(obj, money):   # 归一化设计:统一接口
        obj.pay(money)
    
    
    obj1 = QQpay()
    obj2 = Alipay()
    obj3 = Wechat()
    
    pay(obj1, 100)
    pay(obj2, 200)
    pay(obj3, 300)
    

    5. super深度剖析

    super(类名, self).方法(can's)
    按照self对象从属于类的mro顺序,跳出指定类,执行下一个类的方法。
    
  • 相关阅读:
    用 pytube 爬取 youtube 视频
    Ubuntu W: GPG error: http://archive.ubuntukey....NO_PUBKEY 8D5A09
    windows 下 putty 登陆服务器 显示matlab图形界面
    python27 windows 下三种安装第三方库的办法
    MCMC: The Metropolis-Hastings Sampler
    MCMC: The Metropolis Sampler
    Latex 数学符号
    差点被坑
    新年新flag
    听报告为什么要问问题
  • 原文地址:https://www.cnblogs.com/liwenhu/p/11401552.html
Copyright © 2011-2022 走看看