类的约束指的是子类必须实现父类的某些方法,比如当项目写了一部分,突然来了个新人,在写新接口时,他可能不知道必须要实现某些方法,这种情况容易导致各种问题,那么就需要我们对类进行约束,也就是写新的接口必须要实现某些方法。
方式一:
class Payment:
def pay(self, money):
raise Exception('子类必须实现pay方法')
class Alipay(Payment):
def pay(self, money):
print(f'使用alipay支付了{money}')
class Wechat(Payment):
def zhi_fu(self, money):
print(f'使用wechat支付了{money}')
def pay(obj, money):
obj.pay(money)
obj = Alipay()
pay(obj, 100)
obj1 = Wechat()
pay(obj1,200)
这样在第二种情况使用 wechat时就会报错:
raceback (most recent call last):
File "code.py", line 27, in <module>
pay(obj1,200)
File "code.py", line 19, in pay
obj.pay(money)
File "code.py", line 3, in pay
raise Exception('子类必须实现pay方法')
Exception: 子类必须实现pay方法
这里使用的是主动报错,但更好的方式是使用NotImplementedError,它更通用。即下面这种方式
class Payment:
def pay(self, money):
raise NotImplementedError('子类必须实现pay方法')
方式二:
抽象类:我们知道抽象类不能实现抽象方法,但子类必须实现抽象类的抽象方法。
from abc import ABCMeta, abstractmethod
class Payment(metaclass=ABCMeta):
@abstractmethod
def pay(self, money):
pass
class Alipay(Payment):
def pay(self,money):
print(f'使用alipay支付了{money}')
class Wechat(Payment):
def pay1(self, money):
print(f'使用wechat支付了{money}')
def pay(obj, money):
obj.pay(money)
obj = Alipay()
obj1 = Wechat()
pay(obj, 100)
pay(obj1,200)
同样的情况下,在实例化wechat时会报错:
Traceback (most recent call last):
File "code.py", line 27, in <module>
obj1 = Wechat()
TypeError: Can't instantiate abstract class Wechat with abstract methods pay
即抽象类的子类必须实现抽象方法。