接口类抽象类

接口类(抽象类):

在python中是没有接口类,可以把接口类和抽象类视为同一种
定义:制定一个规范
举例:收到项目经理的要求,写一个支付:

#第一版
class Alipay:
    def __init__(self,money):
        self.money = money

    def pay(self):
        print('zfb支付了%s' % self.money)


class Jd:
    def __init__(self, money):
        self.money = money

    def pay(self):
        print('jd支付了%s' % self.money)

a1 = Alipay(200)a1.pay()a2 = Jd(100)a2.pay()
#第二版,改进:使支付的方法一样
class Alipay:
    def __init__(self,money):
        self.money = money

    def pay(self):
        print('zfb支付了%s' % self.money)
class Jd:
    def __init__(self, money):
        self.money = money

    def pay(self):
        print('jd支付了%s' % self.money)
def pay(obj):
    obj.pay()

a1 = Alipay(200)
j1 = Jd(100)
pay(a1)     #把a1这个方法传给了pay()这个函数,通过其统一寻找访问函数体里的内容
                #归一化设计,可维护性提高

最后定义的pay()函数是在类之外的,每次把括号内的对象代入函数代码块中,

代码块内容里调用pay()方法是先寻找本类,再寻找父类内.

由于两个类中都有相同的pay()方法,通过这个外部的函数就可以实现统一的操作调用.

#第三版  来了一个野生程序员,增加一个微信支付的功能
class Alipay:
    def __init__(self, money):
        self.money = money

    def pay(self):
        print('zfb支付了%s' % self.money)


class Jd:
    def __init__(self, money):
        self.money = money

    def pay(self):
        print('jd支付了%s' % self.money)

class Wechatpay:
    def __init__(self, money):
        self.money = money
    def weixinpay(self):
        print('wx支付了%s' % self.money)

def pay(obj):
    obj.pay()
#
# w1 = Wechatpay(300)
# w1.weixinpay()   #此人新定义的类中没有与前两个类相同的pay()方法,无法实现所有类的归一化操作
第四版  发回去重写,制定一个规则(抽象类,接口类)

from abc import ABCMeta,abstractmethod
#强制执行这个接口类

class Payment(metaclass=ABCMeta): #被所有的子类继承,抽象类,接口类
@abstractmethod #装饰器
def pay(self):
pass #制定了一个规范,要求所有继承我的子类都必须要有一个pay()方法,无则在实例化的时候报错
#重要的方法名,内容不需要有

class Alipay(Payment):
def __init__(self, money):
self.money = money

def pay(self):
print('zfb支付了%s' % self.money)


class Jd(Payment):
def __init__(self, money):
self.money = money

def pay(self):
print('jd支付了%s' % self.money)


class Wechatpay(Payment):
def __init__(self, money):
self.money = money

def pay(self):
print('wx支付了%s' % self.money)


def pay(obj):
obj.pay()

w1 = Wechatpay(300) #此时,若这个类中没有pay()方法则实例化失败,会报错
#想则必须要有

猜你喜欢

转载自www.cnblogs.com/shachengcc1/p/11141197.html