Python 类的约束

类的约束指的是子类必须实现父类的某些方法,比如当项目写了一部分,突然来了个新人,在写新接口时,他可能不知道必须要实现某些方法,这种情况容易导致各种问题,那么就需要我们对类进行约束,也就是写新的接口必须要实现某些方法。

方式一:

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

即抽象类的子类必须实现抽象方法。

上一篇:Python 字典

下一篇:Python f-string