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中利用sqrt()方法进行平方根计算的教程
May 15 Python
python简单获取本机计算机名和IP地址的方法
Jun 03 Python
Python提取网页中超链接的方法
Sep 18 Python
Python+Socket实现基于TCP协议的客户与服务端中文自动回复聊天功能示例
Aug 31 Python
详解Python中如何写控制台进度条的整理
Mar 07 Python
Python lambda表达式用法实例分析
Dec 25 Python
python贪吃蛇游戏代码
Apr 18 Python
对python中不同模块(函数、类、变量)的调用详解
Jul 16 Python
Python之虚拟环境virtualenv,pipreqs生成项目依赖第三方包的方法
Jul 23 Python
Python如何截图保存的三种方法(小结)
Sep 01 Python
教你怎么用python实现字符串转日期
May 24 Python
Python加密技术之RSA加密解密的实现
Apr 08 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对XML的操作详解
2013/06/07 PHP
php通过sort()函数给数组排序的方法
2015/03/18 PHP
php使用文本统计访问量的方法
2016/05/12 PHP
php中json_encode不兼容JSON_UNESCAPED_UNICODE的解决方案
2016/05/31 PHP
用javascript来实现动画导航效果的代码
2007/12/16 Javascript
ext 列表页面关于多行查询的办法
2010/03/25 Javascript
教你用AngularJS框架一行JS代码实现控件验证效果
2014/06/23 Javascript
jQuery 回调函数(callback)的使用和基础
2015/02/26 Javascript
需灵活掌握的Bootstrap预定义排版类 你精通吗?
2016/06/20 Javascript
Vue数据驱动模拟实现4
2017/01/12 Javascript
如何获取元素的最终background-color
2017/02/06 Javascript
BootStrap表单宽度设置方法
2017/03/10 Javascript
jquery submit()不能提交表单的解决方法
2017/04/24 jQuery
vuejs+element-ui+laravel5.4上传文件的示例代码
2017/08/12 Javascript
浅谈 Vue 项目优化的方法
2017/12/16 Javascript
vue实现文字横向无缝走马灯组件效果的实例代码
2019/04/09 Javascript
详解Vue项目中实现锚点定位
2019/04/24 Javascript
vue-父子组件和ref实例详解
2019/11/10 Javascript
vue+element UI实现树形表格
2020/12/29 Vue.js
在Django框架中编写Context处理器的方法
2015/07/20 Python
Windows下Python的Django框架环境部署及应用编写入门
2016/03/10 Python
Tornado协程在python2.7如何返回值(实现方法)
2017/06/22 Python
Ubuntu16.04/树莓派Python3+opencv配置教程(分享)
2018/04/02 Python
Pycharm 创建 Django admin 用户名和密码的实例
2018/05/30 Python
使用Python在Windows下获取USB PID&amp;VID的方法
2019/07/02 Python
详解如何用python实现一个简单下载器的服务端和客户端
2019/10/28 Python
解决python 找不到module的问题
2020/02/12 Python
Python使用QQ邮箱发送邮件实例与QQ邮箱设置详解
2020/02/18 Python
python批量修改xml属性的实现方式
2020/03/05 Python
Django实现whoosh搜索引擎使用jieba分词
2020/04/08 Python
python求解汉诺塔游戏
2020/07/09 Python
详解基于 Canvas 手撸一个六边形能力图
2019/09/02 HTML / CSS
Html5 滚动穿透的方法
2019/05/13 HTML / CSS
英国花园药房: The Garden Pharmacy
2017/12/28 全球购物
Nordgreen台湾官网:极简北欧设计手表
2019/08/21 全球购物
《孔繁森》教学反思
2014/04/17 职场文书