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方法,在实例化对象时就会报错.

浙公网安备 33010602011771号