多态,super,类的约束

1.多态、鸭子类型

面向对象三大特性:封装、继承、多态
多态:python中定义变量不用规定变量的类型,默认支持多态
class Str:
    def index():
        pass
    def count():
        pass      
class List:
    def index():
        pass
    def count():
        pass 
鸭子类型:A,B两个类,没有任何关系,但是里面的功能相似,所以Python一般会将A,B两个类里面相似的功能让其命名相同;虽然A,B无关系,但是很默契地制定了一个规范,使用起来更方便

2.super

class A:
    def f1(self):
        print('in A')

class Foo(A):
    def f1(self):
        super(Foo,self).f1()
        print('in Foo')  # 2

class Bar(A):
    def f1(self):
        print('in Bar')  # 1

class Info(Foo,Bar):

    def f1(self):
        super(Info,self).f1()
        print('in Info f1')  # 3

obj = Info()
print(Info.mro())  # [Info, Foo, Bar, A]
obj.f1()
super:
单继承: super() 肯定是执行父类的方法
多继承: super(A,self) 严格按照self从属于的类的mro的执行顺序,执行A类的下一位

3.类的约束

1. 在父类建立一种约束
class Payment():
    def pay(self,money):          # 约定俗称定义一种规范,子类要定义pay方法
        raise TypeError('子类必须定义此方法')
class QQpay(Payment):
    def pay(self,money):
        print(f'利用QQ支付了{money}元')
class Alipay(Payment):
    def pay (self,money):
        print(f'利用支付宝支付了{money}元')
def pay(obj,money):
    obj.pay(money)
obj1=QQpay()
obj2=Alipay()
pay(obj1,1)
pay(obj2,2)
在父类定义一个pay方法,主动抛出异常,如果子类没有定义pay方法,即会报错  =>  python推荐的约束方式
2. 模拟抽象类(指定一种规范)的概念,建立一种约束
from abc import ABCMeta,abstractmethod
class Payment(metaclass=ABCMeta):      # 抽象类、接口类(规范和约束)   metaclass指定的是一个元类
    @abstractmethod      
    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}元')
def pay(obj,money):
    obj.pay(money)
obj1=QQpay()
obj2=Alipay()
pay(obj1,1)
pay(obj2,2)
基类如上设置,子类如果没有定义pay方法,在实例化对象时就会报错

猜你喜欢

转载自www.cnblogs.com/wxl1025/p/11164270.html