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中的各种函数的使用
May 24 Python
使用Python &amp; Flask 实现RESTful Web API的实例
Sep 19 Python
Python简单实现控制电脑的方法
Jan 22 Python
在Python 2.7即将停止支持时,我们为你带来了一份python 3.x迁移指南
Jan 30 Python
Python 查看list中是否含有某元素的方法
Jun 27 Python
python的pip安装以及使用教程
Sep 18 Python
python使用多进程的实例详解
Sep 19 Python
python3爬虫获取html内容及各属性值的方法
Dec 17 Python
python实现批量视频分帧、保存视频帧
May 31 Python
Python队列、进程间通信、线程案例
Oct 25 Python
python生成大写32位uuid代码
Mar 03 Python
python推导式的使用方法实例
Feb 28 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
smarty中js的调用方法示例
2014/10/27 PHP
Laravel 4 初级教程之Pages、表单验证
2014/10/30 PHP
php获取文章内容第一张图片的方法示例
2017/07/03 PHP
BOOM vs RR BO3 第一场2.13
2021/03/10 DOTA
二级域名转向类
2006/11/09 Javascript
js验证表单大全
2006/11/25 Javascript
javascript显示隐藏层比较不错的方法分析
2008/09/30 Javascript
JS高级笔记
2011/07/13 Javascript
JQuery判断checkbox是否选中及其它复选框操作方法合集
2015/06/01 Javascript
跟我学习javascript解决异步编程异常方案
2015/11/23 Javascript
几种二级联动案例(jQuery\Array\Ajax php)
2016/08/13 Javascript
H5用户注册表单页 注册模态框!
2016/09/17 Javascript
Vue学习笔记进阶篇之函数化组件解析
2017/07/21 Javascript
利用jQuery实现简单的拖曳效果实例代码
2017/10/20 jQuery
vue 自定义 select内置组件
2018/04/10 Javascript
使用Angular自定义字段校验指令的方法示例
2019/02/01 Javascript
Vue实现剪切板图片压缩功能
2020/02/04 Javascript
[46:02]DOTA2上海特级锦标赛D组资格赛#2 Liquid VS VP第二局
2016/02/28 DOTA
Python求导数的方法
2015/05/09 Python
使用Python抓取豆瓣影评数据的方法
2018/10/17 Python
pyspark操作MongoDB的方法步骤
2019/01/04 Python
Python后台管理员管理前台会员信息的讲解
2019/01/28 Python
用Python实现将一张图片分成9宫格的示例
2019/07/05 Python
Python3标准库之threading进程中管理并发操作方法
2020/03/30 Python
详解HTML5 Canvas绘制时指定颜色与透明度的方法
2016/03/25 HTML / CSS
Shoes For Crews法国官网:美国领先的防滑鞋设计和制造商
2018/01/01 全球购物
墨尔本复古时尚品牌:Dangerfield
2018/12/12 全球购物
俄罗斯汽车零件和配件在线商店:CarvilleShop
2019/11/29 全球购物
C#面试问题
2016/07/29 面试题
会走路的树教学反思
2014/02/20 职场文书
妇联主席先进事迹
2014/05/18 职场文书
护理专科学生自荐书
2014/07/05 职场文书
庆祝教师节标语
2014/10/09 职场文书
初一语文教学反思
2016/03/03 职场文书
假如给我三天光明:舟逆水而行,人遇挫而达 
2019/10/29 职场文书
python中__slots__节约内存的具体做法
2021/07/04 Python