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