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查询阿里巴巴关键字排名的方法
Jul 08 Python
Python之reload流程实例代码解析
Jan 29 Python
关于django 数据库迁移(migrate)应该知道的一些事
May 27 Python
python实现彩色图转换成灰度图
Jan 15 Python
python3.6中@property装饰器的使用方法示例
Aug 17 Python
django-rest-swagger的优化使用方法
Aug 29 Python
Python3实现二叉树的最大深度
Sep 30 Python
基于python操作ES实例详解
Nov 16 Python
python等待10秒执行下一命令的方法
Jul 19 Python
Ubuntu权限不足无法创建文件夹解决方案
Nov 14 Python
python机器学习实现oneR算法(以鸢尾data为例)
Mar 03 Python
python自动化测试之Selenium详解
Mar 13 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获取文件名后缀
2013/06/09 PHP
php数组转换js数组操作及json_encode的用法详解
2013/10/26 PHP
Ajax中的JSON格式与php传输过程全面解析
2017/11/14 PHP
Laravel项目中timeAgo字段语言转换的改善方法示例
2019/09/16 PHP
jQuery参数列表集合
2011/04/06 Javascript
jQuery实现的输入框选择时间插件用法实例
2015/02/28 Javascript
jQuery fadeOut 异步实例代码详解
2016/08/18 Javascript
ES6入门教程之let和const命令详解
2017/05/17 Javascript
Vue.js中兄弟组件之间互相传值实例
2017/06/01 Javascript
详解vue-cli本地环境API代理设置和解决跨域
2017/09/05 Javascript
微信小程序iOS下拉白屏晃动问题解决方案
2019/10/12 Javascript
Vue中点击active并第一个默认选中功能的实现
2020/02/24 Javascript
Vue双向绑定实现原理与方法详解
2020/05/07 Javascript
微信小程序实现搜索框功能及踩过的坑
2020/06/19 Javascript
vue+axios全局添加请求头和参数操作
2020/07/24 Javascript
toString.call()通用的判断数据类型方法示例
2020/08/28 Javascript
JS highcharts实现动态曲线代码示例
2020/10/16 Javascript
[42:52]Optic vs Serenity 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
Python显示进度条的方法
2014/09/20 Python
Python中decorator使用实例
2015/04/14 Python
Python线程指南详细介绍
2017/01/05 Python
机器学习python实战之手写数字识别
2017/11/01 Python
基于Django与ajax之间的json传输方法
2018/05/29 Python
Flask实现跨域请求的处理方法
2018/09/27 Python
Django模板语言 Tags使用详解
2019/09/09 Python
Python基于内置函数type创建新类型
2020/10/22 Python
删除pycharm鼠标右键快捷键打开项目的操作
2021/01/16 Python
Shoes For Crews法国官网:美国领先的防滑鞋设计和制造商
2018/01/01 全球购物
美国尼曼百货官网:Neiman Marcus
2019/09/05 全球购物
表演方阵解说词
2014/02/08 职场文书
美化环境标语
2014/06/20 职场文书
信用卡工资证明格式
2014/09/13 职场文书
法人授权委托书
2014/09/16 职场文书
教师三严三实对照检查材料
2014/09/25 职场文书
公司副总经理岗位职责
2014/10/01 职场文书
先进个人总结范文
2015/02/15 职场文书