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应用的教程
Apr 16 Python
Python的爬虫包Beautiful Soup中用正则表达式来搜索
Jan 20 Python
Django中Forms的使用代码解析
Feb 10 Python
TensorFlow 实战之实现卷积神经网络的实例讲解
Feb 26 Python
Python中多个数组行合并及列合并的方法总结
Apr 12 Python
python输入整条数据分割存入数组的方法
Nov 13 Python
Python3 pip3 list 出现 DEPRECATION 警告的解决方法
Feb 16 Python
机器学习实战之knn算法pandas
Jun 22 Python
python psutil监控进程实例
Dec 17 Python
Python如何在windows环境安装pip及rarfile
Jun 15 Python
10个python爬虫入门基础代码实例 + 1个简单的python爬虫完整实例
Dec 16 Python
常用的Python代码调试工具总结
Jun 23 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脚本[带参数]的方法
2010/01/22 PHP
PHP的介绍以及优势详细分析
2019/09/05 PHP
Alliance vs AM BO3 第二场2.13
2021/03/10 DOTA
js 定时器setTimeout无法调用局部变量的解决办法
2013/11/28 Javascript
鼠标移到div,浮层显示明细,弹出层与div的上边距左边距重合(示例代码)
2013/12/14 Javascript
AngularJS发送异步Get/Post请求方法
2018/08/13 Javascript
又拍云 Node.js 实现文件上传、删除功能
2018/10/28 Javascript
webpack结合express实现自动刷新的方法
2019/05/07 Javascript
JavaScript跳出循环的三种方法(break, return, continue)
2019/07/30 Javascript
vue使用swiper实现中间大两边小的轮播图效果
2019/11/24 Javascript
解决vue-router 切换tab标签关闭时缓存问题
2020/07/22 Javascript
python自动化测试之连接几组测试包实例
2014/09/28 Python
在Python的Django框架中simple-todo工具的简单使用
2015/05/30 Python
python Django批量导入数据
2016/03/25 Python
Python机器学习之决策树算法
2017/12/22 Python
python获取代理IP的实例分享
2018/05/07 Python
python pytest进阶之conftest.py详解
2019/06/27 Python
python 将日期戳(五位数时间)转换为标准时间
2019/07/11 Python
django 微信网页授权认证api的步骤详解
2019/07/30 Python
scrapy在python爬虫中搭建出错的解决方法
2020/11/22 Python
如何利用CSS3制作3D效果文字具体实现样式
2013/05/02 HTML / CSS
HTML5实现晶莹剔透的雨滴特效
2014/05/14 HTML / CSS
通过HTML5 Canvas API绘制弧线和圆形的教程
2016/03/14 HTML / CSS
Html5 Canvas动画基础碰撞检测的实现
2018/12/06 HTML / CSS
Jimmy Choo美国官网:周仰杰鞋子品牌
2018/06/08 全球购物
莫斯科的韩国化妆品店:Sifo
2019/12/04 全球购物
Monica Vinader官网:英国轻奢珠宝品牌
2020/02/05 全球购物
Python里面如何拷贝一个对象
2014/02/17 面试题
机关门卫岗位职责
2013/12/30 职场文书
学生会主席就职演讲稿
2014/01/14 职场文书
电子信息科学专业自荐信
2014/01/30 职场文书
五年级英语教学反思
2014/01/31 职场文书
《雨霖铃》听课反思
2014/02/13 职场文书
电视购物广告词
2014/03/19 职场文书
2016年小学六一儿童节活动总结
2016/04/06 职场文书
Memcached介绍及php-memcache扩展安装
2021/04/01 PHP