码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2019-01-17 21:19:25      阅读:206      评论:0      收藏:0      [点我收藏+]

标签:属性   one   pre   abstract   metaclass   str   obj   设计   color   

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

 

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

标签:属性   one   pre   abstract   metaclass   str   obj   设计   color   

原文地址:https://www.cnblogs.com/chen55555/p/10284331.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!