
写法一:
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就会报错。