类扩展式时如何弃用以前的类属性名称

在看flask-admin的源码时,经常看到废弃以前类属性的功能,通过实现一个ObsoleteAttr 来使用新名称替换旧的名称。源码如下:

class ObsoleteAttr(object):
    def __init__(self, new_name, old_name, default):
        self.new_name = new_name
        self.old_name = old_name
        self.cache = '_cache_' + new_name
        self.default = default

    def __get__(self, obj, objtype=None):
        print('get', self, obj, objtype)
        if obj is None:
            return self

        # Check if we have new cached value
        if hasattr(obj, self.cache):
            return getattr(obj, self.cache)

        # Check if there's old attribute
        if hasattr(obj, self.old_name):
            print('Property %s is obsolete, please use %s instead' %
                          (self.old_name, self.new_name))
            return getattr(obj, self.old_name)

        # Return default otherwise
        return self.default

    def __set__(self, obj, value):
        setattr(obj, self.cache, value)

ObsoleteAttr 通过使用__get____set__进行属性替换和设置值。
在使用时如类A中存在old_name属性,使用new_name属性替换,此时使用方法如下:

class A(object):
    new_name = ObsoleteAttr('new_name', 'old_name', None)

class B(A):
    old_name = {'hello': 'world'}

B.new_name
b = B()
print b.new_name

('get', <__main__.ObsoleteAttr object at 0x10f7a6890>, None, <class '__main__.B'>)
('get', <__main__.ObsoleteAttr object at 0x10f7a6890>, <__main__.B object at 0x10f7a6b90>, <class '__main__.B'>)
Property old_name is obsolete, please use new_name instead
{'hello': 'world'}

__set____get__ 的解释可以参考python文档,后续再补充具体解释。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值