python中类的约束和限制对象添加属性

通过__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)

 

posted @ 2019-01-17 20:14  平平无奇小辣鸡  阅读(1266)  评论(0编辑  收藏  举报