python-34-接口类与抽象类

前言

接口类与抽象类是一种设计的模式,一种写代码的规范。

  • 接口类 : 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 !!!

原文地址:https://www.cnblogs.com/gsxl/p/12497708.html