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中字典dict常用操作方法实例总结
Apr 04 Python
使用Python写CUDA程序的方法
Mar 27 Python
利用Opencv中Houghline方法实现直线检测
Feb 11 Python
python切片及sys.argv[]用法详解
May 25 Python
python logging重复记录日志问题的解决方法
Jul 12 Python
python画一个玫瑰和一个爱心
Aug 18 Python
Python flask框架post接口调用示例
Jul 03 Python
python paramiko远程服务器终端操作过程解析
Dec 14 Python
Pycharm连接远程服务器过程图解
Apr 30 Python
Win10下配置tensorflow-gpu的详细教程(无VS2015/2017)
Jul 14 Python
python 字典和列表嵌套用法详解
Jun 29 Python
python编程实现清理微信重复缓存文件
Nov 01 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
第六节--访问属性和方法
2006/11/16 PHP
php时间戳转换的示例
2014/03/31 PHP
PHP中模拟链表和链表的基本操作示例
2016/02/27 PHP
JavaScript与DropDownList 区别分析
2010/01/01 Javascript
JQuery上传插件Uploadify使用详解及错误处理
2010/04/27 Javascript
Ext对基本类型的扩展 ext,extjs,format
2010/12/25 Javascript
js中传递特殊字符(+,&amp;)的方法
2014/01/16 Javascript
JavaScript判断文件上传类型的方法
2014/09/02 Javascript
jQuery 和 CSS 的文本特效插件集锦
2014/12/12 Javascript
JS实现文件动态顺序载入的方法
2015/03/07 Javascript
JavaScript获取并更改input标签name属性的方法
2015/07/02 Javascript
一分钟理解js闭包
2016/05/04 Javascript
js实现tab选项卡切换功能
2017/01/13 Javascript
利用纯JS实现像素逐渐显示的方法示例
2017/08/14 Javascript
vue 开发一个按钮组件的示例代码
2018/03/27 Javascript
vue实现选项卡及选项卡切换效果
2018/04/24 Javascript
Vue中用props给data赋初始值遇到的问题解决
2018/11/27 Javascript
微信小程序实现用table显示数据库反馈的多条数据功能示例
2019/05/07 Javascript
vuex(vue状态管理)的特殊应用案例分享
2020/03/03 Javascript
JavaScript实现4位随机验证码的生成
2021/01/28 Javascript
[53:21]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS LGD-CDEC
2014/05/22 DOTA
[01:32]寻找你心中的那团火 DOTA2 TI9火焰传递活动今日开启
2019/05/16 DOTA
Python读写unicode文件的方法
2015/07/10 Python
windows 10下安装搭建django1.10.3和Apache2.4的方法
2017/04/05 Python
Python创建二维数组实例(关于list的一个小坑)
2017/11/07 Python
python 将对象设置为可迭代的两种实现方法
2019/01/21 Python
对python pandas读取剪贴板内容的方法详解
2019/01/24 Python
利用pyecharts实现地图可视化的例子
2019/08/12 Python
解决python打开https出现certificate verify failed的问题
2020/09/03 Python
python 实现性别识别
2020/11/21 Python
html5 canvas合成海报所遇问题及解决方案总结
2017/08/03 HTML / CSS
英国和世界各地鲜花速递专家:Arena Flowers
2018/02/10 全球购物
党员领导干部廉洁从政承诺书
2014/03/27 职场文书
2015年项目经理工作总结
2015/04/30 职场文书
vue3如何优雅的实现移动端登录注册模块
2021/03/29 Vue.js
苹果可能正在打击不进行更新的 App
2022/04/24 数码科技