写法一:

class Payment:
    def pay(self, money):
        raise NotImplementedError


class Alipay(Payment):
    def pay(self, money):
        print('支付宝支付{}元。'.format(money))


class Yunpay(Payment):
    def pay(self, money):
        print('云支付{}元。'.format(money))


class Mypay(Payment):
    def zhifu(self, money):
        print('我的支付{}元。'.format(money))


def payx(payment, money):
    payment.pay(money)


payx(Mypay(), 90)

  由于Mypay类并未实现pay方法,所以上述代码会报错: NotImplementedError

这就起到了限制作用。

但是这种写法如果不去调用Mypay.pay就不会报错。

 

第二种写法:

from abc import ABCMeta, abstractmethod


class Payment(metaclass=ABCMeta):
    @abstractmethod
    def pay(self, money):
        pass


class Alipay(Payment):
    def pay(self, money):
        print('支付宝支付{}元。'.format(money))


class Yunpay(Payment):
    def pay(self, money):
        print('云支付{}元。'.format(money))


class Mypay(Payment):
    def zhifu(self, money):
        print('我的支付{}元。'.format(money))


def payx(payment, money):
    payment.pay(money)


payx(Mypay(), 90)

  报错:TypeError: Can't instantiate abstract class Mypay with abstract methods pay

同样起到了限制作用,而这种写法只要调用Mypay就会报错。