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有证书的加密解密实现方法
Nov 19 Python
在Python中marshal对象序列化的相关知识
Jul 01 Python
python 安装virtualenv和virtualenvwrapper的方法
Jan 13 Python
Python新手入门最容易犯的错误总结
Apr 24 Python
基于python socketserver框架全面解析
Sep 21 Python
python 3.6.2 安装配置方法图文教程
Sep 18 Python
Python面向对象程序设计OOP深入分析【构造函数,组合类,工具类等】
Jan 05 Python
详解python pandas 分组统计的方法
Jul 30 Python
Python时间序列缺失值的处理方法(日期缺失填充)
Aug 11 Python
python matplotlib饼状图参数及用法解析
Nov 04 Python
python cookie反爬处理的实现
Nov 01 Python
如何利用python和DOS获取wifi密码
Mar 31 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执行linux系统命令的常用函数使用说明
2010/04/27 PHP
完美解决令人抓狂的zend studio 7代码提示(content Assist)速度慢的问题
2013/06/20 PHP
php实现的http请求封装示例
2016/11/08 PHP
PHP编程中的Session阻塞问题与解决方法分析
2017/08/07 PHP
PHP切割整数工具类似微信红包金额分配的思路详解
2019/09/18 PHP
用js怎么把&amp;字符换成&quot;&amp;amp:&quot;
2006/10/19 Javascript
基于jquery ajax 用户无刷新登录方法详解
2012/04/28 Javascript
jquery特效 幻灯片效果示例代码
2013/07/16 Javascript
简单实用的反馈表单无刷新提交带验证
2013/11/15 Javascript
详解js的事件处理函数和动态创建html标记方法
2016/12/16 Javascript
Javascript基础回顾之(二) js作用域
2017/01/31 Javascript
判断滚动条滑到底部触发事件(实例讲解)
2017/11/15 Javascript
原生JS实现的跳一跳小游戏完整实例
2019/01/27 Javascript
Layui带搜索的下拉框的使用以及动态数据绑定方法
2019/09/28 Javascript
vue excel上传预览和table内容下载到excel文件中
2019/12/10 Javascript
JavaScript实现移动端弹窗后禁止滚动
2020/05/25 Javascript
three.js着色器材质的内置变量示例详解
2020/08/16 Javascript
[50:29]2014 DOTA2华西杯精英邀请赛 5 24 DK VS iG
2014/05/26 DOTA
[00:33]DOTA2上海特级锦标赛 CDEC战队宣传片
2016/03/04 DOTA
python网络编程学习笔记(10):webpy框架
2014/06/09 Python
python中global用法实例分析
2015/04/30 Python
JSONLINT:python的json数据验证库实例解析
2017/11/28 Python
pandas创建新Dataframe并添加多行的实例
2018/04/08 Python
python3实现随机数
2018/06/25 Python
Python 导入文件过程图解
2019/10/15 Python
k-means 聚类算法与Python实现代码
2020/06/01 Python
Python with语句用法原理详解
2020/07/03 Python
Python猫眼电影最近上映的电影票房信息
2020/09/18 Python
纯CSS3实现的阴影效果
2014/12/24 HTML / CSS
html5标记文字_动力节点Java学院整理
2017/07/11 HTML / CSS
Html5新特性用canvas标签画多条直线附效果截图
2014/06/30 HTML / CSS
利用异或运算实现两个无符号数的加法运算
2013/12/20 面试题
校庆活动方案
2014/03/31 职场文书
《夸父追日》教学反思
2016/02/20 职场文书
python基础学习之递归函数知识总结
2021/05/26 Python