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生成器generator之next和send的运行流程(详解)
May 08 Python
numpy.std() 计算矩阵标准差的方法
Jul 11 Python
对python的输出和输出格式详解
Dec 08 Python
python 机器学习之支持向量机非线性回归SVR模型
Jun 26 Python
python 实现图片上传接口开发 并生成可以访问的图片url
Dec 18 Python
PyTorch和Keras计算模型参数的例子
Jan 02 Python
pycharm无法导入本地模块的解决方式
Feb 12 Python
结束运行python的方法
Jun 16 Python
python Gabor滤波器讲解
Oct 26 Python
python 利用opencv实现图像网络传输
Nov 12 Python
Scrapy实现模拟登录的示例代码
Feb 21 Python
PySwarms(Python粒子群优化工具包)的使用:GlobalBestPSO例子解析
Apr 05 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
CI操作cookie的方法分析(基于helper类库)
2016/03/28 PHP
PHP检查网站是否宕机的方法示例
2017/07/24 PHP
php 截取中英文混合字符串的方法
2018/05/31 PHP
小型js框架veryide.librar源代码
2009/03/05 Javascript
qTip 基于JQuery的Tooltip插件[兼容性好]
2010/09/01 Javascript
IE中jquery.form中ajax提交没反应解决方法分享
2012/09/11 Javascript
javaScript年份下拉列表框内容为当前年份及前后50年
2014/05/28 Javascript
基于JavaScript操作DOM常用的API小结
2015/12/01 Javascript
window.close(); 关闭浏览器窗口js代码的总结介绍
2016/07/14 Javascript
canvas实现图像布局填充功能
2017/02/06 Javascript
node打造微信个人号机器人的方法示例
2018/04/26 Javascript
jQuery+CSS实现的标签页效果示例【测试可用】
2018/08/14 jQuery
JS实现盒子跟着鼠标移动及键盘方向键控制盒子移动效果示例
2019/01/29 Javascript
vue2.0结合Element-ui实战案例
2019/03/06 Javascript
JavaScript实现拖拽效果
2020/03/16 Javascript
[02:20]2014DOTA2西雅图邀请赛 MVP外卡赛首胜采访
2014/07/09 DOTA
python cx_Oracle模块的安装和使用详细介绍
2017/02/13 Python
spark dataframe 将一列展开,把该列所有值都变成新列的方法
2019/01/29 Python
详解python中eval函数的作用
2019/10/22 Python
python中有帮助函数吗
2020/06/19 Python
Python 如何调试程序崩溃错误
2020/08/03 Python
使用html2canvas实现浏览器截图的示例代码
2018/01/26 HTML / CSS
表达自我的市场:Society6
2018/08/01 全球购物
美国最大的船只买卖在线市场:Boat Trader
2018/08/04 全球购物
澳大利亚领先的武术用品和健身器材供应商:SMAI
2019/03/24 全球购物
KELLER SPORTS荷兰:在线订购最好的运动产品
2020/10/13 全球购物
德国富尔达运动鞋店:43einhalb
2020/12/25 全球购物
PHP如何防止SQL注入
2014/05/03 面试题
最新英语专业学生求职信范文
2013/09/21 职场文书
网络工程师的自我评价
2013/10/02 职场文书
追悼会子女答谢词
2014/01/28 职场文书
信息与计算科学专业推荐信
2014/02/23 职场文书
我的中国梦主题教育活动总结
2015/05/07 职场文书
狂人日记读书笔记
2015/06/30 职场文书
公司保洁员管理制度
2015/08/04 职场文书
MySQL数字类型自增的坑
2021/05/07 MySQL