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使用递归解决全排列数字示例
Feb 11 Python
Python程序员鲜为人知但你应该知道的17个问题
Jun 04 Python
浅析Python中的多进程与多线程的使用
Apr 07 Python
Python单元测试框架unittest使用方法讲解
Apr 13 Python
Python实现的文本编辑器功能示例
Jun 30 Python
Python cookbook(字符串与文本)针对任意多的分隔符拆分字符串操作示例
Apr 19 Python
详解关于Django中ORM数据库迁移的配置
Oct 08 Python
python获取微信企业号打卡数据并生成windows计划任务
Apr 30 Python
Python使用itchat模块实现简单的微信控制电脑功能示例
Aug 26 Python
python单例设计模式实现解析
Jan 07 Python
详解Pandas 处理缺失值指令大全
Jul 30 Python
使用pytorch实现线性回归
Apr 11 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数组函数序列之each() - 获取数组当前内部指针所指向元素的键名和键值,并将指针移到下一位
2011/10/31 PHP
PHP中空字符串介绍0、null、empty和false之间的关系
2012/09/25 PHP
适用于初学者的简易PHP文件上传类
2015/10/29 PHP
PHP引用的调用方法分析
2016/04/25 PHP
PHP 结合 Boostrap 结合 js 实现学生列表删除编辑及搜索功能
2019/05/21 PHP
Windows服务器中PHP如何安装redis扩展
2019/09/27 PHP
html a标签-超链接中confirm方法使用介绍
2013/01/04 Javascript
用jquery.sortElements实现table排序
2014/05/04 Javascript
浅谈JavaScript中定义变量时有无var声明的区别
2014/08/18 Javascript
node.js中实现同步操作的3种实现方法
2014/12/05 Javascript
js实现字符全排列算法的简单方法
2017/05/01 Javascript
Vue异步加载about组件
2017/10/31 Javascript
详解Vue Elementui中的Tag与页面其它元素相互交互的两三事
2018/09/25 Javascript
利用js-cookie实现前端设置缓存数据定时失效
2019/06/18 Javascript
javascript设计模式 ? 模板方法模式原理与用法实例分析
2020/04/23 Javascript
Python正则表达式经典入门教程
2017/05/22 Python
Python2 Selenium元素定位的实现(8种)
2019/02/25 Python
Django CSRF跨站请求伪造防护过程解析
2019/07/31 Python
Python3 无重复字符的最长子串的实现
2019/10/08 Python
pycharm 多行批量缩进和反向缩进快捷键介绍
2021/01/15 Python
css3 矩阵的使用详解
2018/03/20 HTML / CSS
html5 video全屏播放/自动播放的实现示例
2020/08/06 HTML / CSS
澳大利亚领先的在线美容商城:Adore Beauty
2017/04/14 全球购物
Miller Harris官网:英国小众香水品牌
2020/09/24 全球购物
工程现场管理求职自荐信
2013/10/02 职场文书
开工庆典邀请函范文
2014/01/16 职场文书
七年级音乐教学反思
2014/01/26 职场文书
家长对孩子的感言
2014/03/10 职场文书
廉洁家庭事迹材料
2014/05/15 职场文书
伊琍体标语
2014/06/25 职场文书
缓刑人员思想汇报
2014/10/11 职场文书
活动总结书怎么写
2015/05/11 职场文书
班级联欢会主持词
2015/07/03 职场文书
thinkphp 获取控制器及控制器方法
2021/04/16 PHP
MySQL数据迁移相关总结
2021/04/29 MySQL
Python使用socket去实现TCP客户端和TCP服务端
2022/04/12 Python