zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    Appium环境搭建及“fn must be a function”问题解决
    jmeter XML格式的结果中各属性的含义
    初识java,编写hello world语句
    【J-meter】参数及相应数据中文显示乱码问题
    【APP测试】APP弱网环境测试
    【Fiddler】改写返回数据功能
    【WebGoat习题解析】Parameter Tampering->Bypass HTML Field Restrictions
    【WebGoat习题解析】AJAX Security->Insecure Client Storage
    【burp】配置HTTPS抓包方法
    【APP自动化测试】Monkey的测试原理和方法
  • 原文地址:https://www.cnblogs.com/chen55555/p/10284331.html
Copyright © 2011-2022 走看看