类扩展式时如何弃用以前的类属性名称
2016-02-26 14:59
344 查看
在看flask-admin的源码时,经常看到废弃以前类属性的功能,通过实现一个
在
在使用时如类A中存在old_name属性,使用new_name属性替换,此时使用方法如下:
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文档,后续再补充具体解释。
相关文章推荐
- 如何处理PB级别数据(2)——Apache Solr 之 使用SolrJ操作索引库
- c++ 文件写样例
- [转]命令行打开文件夹窗口
- 爬虫:selenium + phantomjs 解决js抓取问题(一)
- Git基本操作
- 老李分享:Oracle数据库调优工具 2
- while和switch
- 老李分享:Oracle数据库调优工具
- android 如何查看android-support-v4.jar 或v7源码
- CSDN-markdown编辑器
- iptables
- 如何处理PB级别数据(1)——Elasticsearch与Solr 选型
- 关于Dragger2与RXjava集合框架的项目随笔
- spring整合quartz任务调度框架使用
- oneproxy5.8.1新版本的配置
- Windows7安装Mongodb
- bootstrap基础学习二篇
- Windows平台配置Appium+Java环境
- 一次疲惫,烦躁,坚持,些许失败的重构经验
- Android AIDL Service调试方法