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)
  • 相关阅读:
    CSS3 object-fit 图像裁剪
    jQuery.extend 使用函数
    ios 不支持iframe 解决方案
    详解HTML5中rel属性的prefetch预加载功能使用
    web页面加载、解析、渲染过程
    TCP的三次握手(建立连接)与 四次挥手(关闭连接)
    html---规范、细节积累-01
    pio设置单元格式
    让一个数字显示指定位数
    linux下获取微秒级精度的时间
  • 原文地址:https://www.cnblogs.com/chen55555/p/10284331.html
Copyright © 2011-2022 走看看