2021/1/17 类的多态(鸭子类型)super()详解,类的约束(python)

类的多态

python是支持多态的,是弱规范化语言,不像Java是强规范化语言

python 中 变量的定义 a = '' , a = 1 ,a = True都是可以指向的

在Java 在未声明多态时,String a = new String(''),int a = 1 , list a = {}这种强制声明,当a对象指向不是规定数据类型就会产生错误

 

鸭子类型

"""
#鸭子类型
    python中,你看起来像鸭子,那么你就是鸭子
"""
class A:
    def login(self):
        pass

    def register(self):
        pass


class B:
    def login(self):
        pass

    def register(self):
        pass

# A B两个类,没有任何关系,独立两个,但是里面的功能相似,所以python一般会将类似A,B两个类
# 里面的相似功能让其命名相同
# 1. A,B 虽然无关系,但是很默契的制定了一个规范,让你使用起来更方便

super()

super() 严格意义并不是执行父类的方法
单继承:super()肯定是执行父类的方法
多继承:super(S, self) 严格按照self从属于类的mro的执行顺序,执行S类的下一位

 

类的约束

class QQpay:
    def pay(self, money):
        print(f'利用qq支付支付了{money}')

class Alipay:
    def pay(self, money):
        print(f'利用支付宝支付支付了{money}')


obj1 = QQpay()
obj1.pay(100)

obj2 = Alipay()
obj2.pay(200)

# 归一化设计
# 统一接口
def pay(obj, money):
    obj.pay(money)

obj1 = QQpay()
obj2 = Alipay()

pay(obj1, 100)
pay(obj2, 200)

# 在上面的情况下(在一些重要的逻辑,于用户数据相关等核心部分),我们要建立一种约束,避免发生此类错误。
# 类的约束又两种解决方式:
# 1. 在父类建立一种约束。
# 2. 利用抽象类(指定一种约束)的概念,建立一种约束.

第一种解决方法

class Payment:
    def pay(self, money):# 约定俗称定义一种规范,子类要定义pay方法.
        raise Exception('请按照规范书写')

class QQpay(Payment):
    def pay(self, money):
        print(f'利用qq支付支付了{money}')

class Alipay(Payment):
    def pay(self, money):
        print(f'利用支付宝支付支付了{money}')

class Wechatpaay(Payment):
    # def pay(self, money):
    #     print(f'利用微信支付支付了{money}')
    def wxpay(self, money):
        print(f'利用微信支付支付了{money}')


def pay(obj, money):
     obj.pay(money)


obj3 = Wechatpaay()
pay(obj3, 300)

第一种约束:在父类定义一个pay方法,主动抛出异常,如果子类没有定义pay方法,并且沿用了父类的pay方法

第二种解决方法

from abc import ABCMeta,abstractclassmethod

class Payment(metaclass=ABCMeta):
    @abstractclassmethod
    def pay(self, money):
        passclass QQpay(Payment):
    def pay(self, money):
        print(f'利用qq支付支付了{money}')

class Alipay(Payment):
    def pay(self, money):
        print(f'利用支付宝支付支付了{money}')

class Wechatpaay(Payment):
    # def pay(self, money):
    #     print(f'利用微信支付支付了{money}')
    def wxpay(self, money):
        print(f'利用微信支付支付了{money}')


def pay(obj, money):
     obj.pay(money)


obj3 = Wechatpaay()
pay(obj3, 300)

利用抽象类的概率: 基类如上设置,子类如果没有定义pay方法,在实例化对象时就会报错.

posted @ 2021-01-17 23:33  ping_sen  阅读(93)  评论(0)    收藏  举报