通過__slots__限制對象可添加的屬性
class A: __slots__ = ['a', 'b'] pass a1 = A() a1.a = 10 print(a1.a) a1.c = 0 # 只能添加a,b屬性添加其他屬性就報錯
沒有約束
class Alipay: def pay(self, money): print('此次消費%s' % money) class QQpay: def pay(self, money): print('此次消費%s' % money) def pay(obj, money): obj.pay(money)
弱約束
class Pay: # 弱約束 def pay(self, money): pass class Alipay(Pay): def pay(self, money): print('此次消費%s' % money) class QQpay(Pay): def pay(self, money): print('此次消費%s' % money) class Wechatpay(Pay): def fuqian(self, money): # 不規范,不報錯 print('此次消費%s' % money) # class Wechatpay: # def pay(self, money): # 規范統一 # print('此次消費%s' % money) def pay(obj, money): obj.pay(money) a1 = Alipay() q1 = QQpay() c1 = Wechatpay() # a1.pay(100) # q1.pay(200) pay(a1, 100) pay(q1, 200) pay(c1, 300)
強制約束
方法一、若不實現父類方法主動主動拋出異常進行約束
# 這個父類制定了一個約束,規范,子類一定要有pay方法。 class Pay: def pay(self, money): # 主動拋異常 raise Exception('未定義pay方法') class Alipay(Pay): def pay(self, money): print('此次消費%s' % money) class QQpay(Pay): def pay(self, money): print('此次消費%s' % money) class Wechatpay: def pay(self, money): print('此次消費%s' % money) class Unitypay(Pay): def fuqian(self, money): # 沒實現父類方法 print('此次消費%s' % money) def pay(obj, money): # 歸一化設計 obj.pay(money) a1 = Alipay() q1 = QQpay() c1 = Wechatpay() d1 = Unitypay() # a1.pay(100) # q1.pay(200) # pay(a1, 100) # pay(q1, 200) # pay(c1, 300) pay(d1, 200) # 沒實現父類方法在此處拋異常
方法二、利用模塊,如果子類不實現父類方法在實例化時就報錯
from abc import abstractmethod from abc import ABCMeta class Pay(metaclass=ABCMeta): # 抽象類,在實例化就報錯 @abstractmethod # 定一個約束,規范,約束子類中一定要有pay方法 def pay(self, money): pass class Alipay(Pay): def pay(self, money): print('此次消費%s' % money) class QQpay(Pay): def pay(self, money): print('此次消費%s' % money) class Wechatpay: def pay(self, money): print('此次消費%s' % money) class Unitypay(Pay): def fuqian(self, money): # 沒實現父類方法 print('此次消費%s' % money) def pay(obj, money): obj.pay(money) a1 = Alipay() q1 = QQpay() c1 = Wechatpay() d1 = Unitypay() # 沒實現父類方法,實例化時就報錯 # a1.pay(100) # q1.pay(200) # pay(a1, 100) # pay(q1, 200) # pay(c1, 300) pay(d1, 200)
