Python中使用装饰器和元编程实现结构体类实例


Posted in Python onJanuary 28, 2015

Ruby中有一个很方便的Struct类,用来实现结构体。这样就不用费力的去定义一个完整的类来仅仅用作访问属性。

class Dog < Struct.new(:name, :age)

end
fred = Dog.new("fred", 5)

printf "name:%s age:%d", fred.name, fred.age

##name:fred age:5

Python3.4中也可以这么干,但写法很累赘。其中包含self.name = name 这种很烦人的写法。
class Dog(object):

    def __init__(self, name, age):

        self.name = name

        self.age = age
fred = Dog("fred", 5)

print('name:{name} age:{age}'.format(name=fred.name, age=fred.age))

##name:fred age:5

想到我大Python是无所不能的,有没有一种简化结构体类属性定义的方法呢?答案肯定是有的。在补习了一些Python黑魔法技术后,我想到利用装饰器函数和元编程技术来实现。
def struct(*name):

    """ 装饰器函数

        用途:用于在类定义中,自动设置self.value = value

    """

    def decorator(func):

        def wrapper(*args, **kw):

            for i in range(len(name)):

                setattr(args[0], name[i], args[i+1])

            return func(*args, **kw)

        return wrapper

    return decorator
class Dog(object):

    @struct('name','age')   #黑魔法所在!

    def __init__(self, *all_value):

        pass
fred = Dog("fred", 5)

print('name:{name} age:{age}'.format(name=fred.name, age=fred.age))

##name:fred age:5

要注意的是,这种写法会造成代码结构的不清晰。
Python 相关文章推荐
用Python编写简单的定时器的方法
May 02 Python
浅析Python基础-流程控制
Mar 18 Python
Python实现连接postgresql数据库的方法分析
Dec 27 Python
python绘制立方体的方法
Jul 02 Python
Python 运行.py文件和交互式运行代码的区别详解
Jul 02 Python
详解程序意外中断自动重启shell脚本(以Python为例)
Jul 26 Python
python 实现单通道转3通道
Dec 03 Python
如何基于Python实现自动扫雷
Jan 06 Python
Pytorch学习之torch用法----比较操作(Comparison Ops)
Jun 28 Python
python中scrapy处理项目数据的实例分析
Nov 22 Python
Django实现翻页的示例代码
May 24 Python
python实现局部图像放大
Nov 17 Python
Python实现Const详解
Jan 27 #Python
python映射列表实例分析
Jan 26 #Python
Python操作MySQL简单实现方法
Jan 26 #Python
Python中的is和id用法分析
Jan 26 #Python
Python的批量远程管理和部署工具Fabric用法实例
Jan 23 #Python
推荐11个实用Python库
Jan 23 #Python
17个Python小技巧分享
Jan 23 #Python
You might like
PHP中创建并处理图象
2006/10/09 PHP
PHP 和 XML: 使用expat函数(三)
2006/10/09 PHP
使用zend studio for eclipse不能激活代码提示功能的解决办法
2009/10/11 PHP
php将图片文件转换成二进制输出的方法
2015/06/10 PHP
PHP实现数据四舍五入的方法小结【4种方法】
2019/03/27 PHP
LBS blog sql注射漏洞[All version]-官方已有补丁
2007/08/26 Javascript
ajax java 实现自动完成功能
2012/12/19 Javascript
jquery插件之信息弹出框showInfoDialog(成功/错误/警告/通知/背景遮罩)
2013/01/09 Javascript
JavaScript函数定义的常见注意事项小结
2014/09/16 Javascript
Jquery1.9.1源码分析系列(六)延时对象应用之jQuery.ready
2015/11/24 Javascript
全面解析Bootstrap布局组件应用
2016/02/22 Javascript
jQuery的内容过滤选择器学习教程
2016/04/18 Javascript
VUEJS实战之修复错误并且美化时间(2)
2016/06/13 Javascript
js完整倒计时代码分享
2016/09/18 Javascript
JS仿Base.js实现的继承示例
2017/04/07 Javascript
JS实现简单抖动效果
2017/06/01 Javascript
通过V8源码看一个关于JS数组排序的诡异问题
2017/08/14 Javascript
详解webpack3编译兼容IE8的正确姿势
2017/12/21 Javascript
详解Vue webapp项目通过HBulider打包原生APP
2018/06/29 Javascript
微信小程序与webview交互实现支付功能
2019/06/07 Javascript
基于Ionic3实现选项卡切换并重新加载echarts
2020/09/24 Javascript
Python Mysql数据库操作 Perl操作Mysql数据库
2009/01/12 Python
Python实现快速排序和插入排序算法及自定义排序的示例
2016/02/16 Python
利用python修改json文件的value方法
2018/12/31 Python
python gensim使用word2vec词向量处理中文语料的方法
2019/07/05 Python
opencv+python实现均值滤波
2020/02/19 Python
CSS3教程(7):CSS3嵌入字体
2009/04/02 HTML / CSS
phpquery中文手册
2021/03/18 PHP
Kipling凯浦林美国官网:世界著名时尚休闲包袋品牌
2016/08/24 全球购物
梅西酒窖:Macy’s Wine Cellar
2018/01/07 全球购物
Senreve官网:美国旧金山的奢侈手袋品牌
2019/03/21 全球购物
StubHub美国:购买或出售您的门票
2019/07/09 全球购物
求职信的要素有哪些呢
2013/12/26 职场文书
社区党建工作方案
2014/06/10 职场文书
步步惊心观后感
2015/06/12 职场文书
小学语文教学反思范文
2016/03/03 职场文书