通过__slots__限制对象可添加的属性
class A:__slots__ = ['a', 'b']passa1 = 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):passclass 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 ABCMetaclass Pay(metaclass=ABCMeta): # 抽象类,在实例化就报错@abstractmethod # 定一个约束,规范,约束子类中一定要有pay方法def pay(self, money):passclass 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)