前言
接口类与抽象类是一种设计的模式,一种写代码的规范。
- 接口类 : python原生不支持
- 抽象类 : python原生支持的
一、接口类与多继承接口类
1、接口类:统一一个支付的入口
# 1、接口类:统一一个支付的入口
class A_pay:
def pay(self, money):
print('A钱包支付:%s元' % money)
class B_pay:
def pay(self, money):
print('B钱包支付:%s元' % money)
def pay(pay_ojb, money):
'''pay对象:统一支付入口'''
pay_ojb.pay(money)
pay(A_pay(), 1000)
pay(B_pay(), 100)
2、假如新同学接手怎么写?所以要有接口类规范化:①创建一个规范父类;②元类:metaclass=ABCMeta;③装饰某方法作为约束规范;
如果没有根据规范,在实例化的时候就会报错,就容易知道是哪里的问题了。
# 2、假如新同学接手怎么写?所以要有接口类规范化
# ①创建一个规范父类;②元类:metaclass=ABCMeta;③装饰某方法作为约束规范;
from abc import abstractclassmethod, ABCMeta
class Payment(metaclass=ABCMeta): # 元类,规范的类。
@abstractclassmethod # 引用装饰该方法,作为约束的方法。
def pay(self, money):pass
class A_pay(Payment):
def pay(self, money):
print('A钱包支付:%s元' % money)
class B_pay(Payment):
def pay(self, money):
print('B钱包支付:%s元' % money)
class C_pay(Payment):
def shop_pay(self, money):
print('C钱包支付:%s元' % money)
def pay(pay_ojb, money):
'''pay对象:统一支付入口'''
pay_ojb.pay(money)
ret = C_pay()
3、接口类多继承:
接口类遵循着接口隔离原则,是面向对象开发的思想的一种规范!
如果规范了某个类的方法,继承后没有该方法会报错,直接会抛出找不到这个规范的方法:
# 3、接口类多继承
# A会唱歌、打篮球
# B会唱歌、开车
# C会唱歌、开车、打篮球
from abc import abstractmethod,ABCMeta
class All_abc(metaclass=ABCMeta): # 规范
@abstractmethod
def sing(self):pass
@abstractmethod
def ball(self):pass
@abstractmethod
def drive(self):pass
class Sing_ojb(metaclass=ABCMeta): # 唱歌
@abstractmethod
def sing(self):pass
class Ball_ojb(metaclass=ABCMeta): # 打篮球
@abstractmethod
def ball(self):pass
class Drive_ojb(metaclass=ABCMeta): # 开车
@abstractmethod
def drive(self):pass
class A(Sing_ojb, Ball_ojb): # A会唱歌、打篮球
def sing(self):return Sing_ojb
def ball(self):return Ball_ojb
ret = A()
print(ret.ball())
二、抽象类
一般情况下抽象类用的是单继承,所以在父类中可以有一些简单的基础实现
多继承的情况如果功能比较复杂,所以不容易抽象出相同的功能的具体实现写在父类中,抽象类不能被实例化。
1、抽象类
# 3、抽象类
# A会唱歌
# B会唱歌、开车
import abc
class All_ab(metaclass=abc.ABCMeta): # All_ab:抽象类
@abc.abstractmethod
def sing(self):pass # 定义抽象类规范的方法
@abc.abstractmethod
def drive(self):pass # 定义抽象类规范的方法
class A(All_ab): # 子类继承父类,必须要定义父类(抽象类)规范的方法
def sing(self):return '唱歌'
def drive(self):return '开车'
ret = A()
print(ret.drive())
总结:这是一种设计模式的规范
- Python模仿Java,所以抽象类推荐用单继承,接口类推荐用多继承。
- python中自带多继承 所以我们直接用class来实现了接口类。
- Python中不管是抽象类还是接口类,都不能被实例化。
- Python本身不支持原生接口类(是一种概念),抽象类和接口类都是有规范。
欢迎来大家QQ交流群一起学习:482713805 !!!