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选择排序、冒泡排序、合并排序代码实例
Apr 10 Python
使用Python装饰器在Django框架下去除冗余代码的教程
Apr 16 Python
python写日志封装类实例
Jun 28 Python
Python简单实现子网掩码转换的方法
Apr 13 Python
使用python装饰器计算函数运行时间的实例
Apr 21 Python
Python创建字典的八种方式
Feb 27 Python
使用Python制作一个打字训练小工具
Oct 01 Python
Django后台管理系统的图文使用教学
Jan 20 Python
Win10下用Anaconda安装TensorFlow(图文教程)
Jun 18 Python
Python Pandas list列表数据列拆分成多行的方法实现
Dec 14 Python
python多线程爬取西刺代理的示例代码
Jan 30 Python
Python 高级库15 个让新手爱不释手(推荐)
May 15 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 购物车实例(申精)
2009/05/11 PHP
php结合md5实现的加密解密方法
2016/01/25 PHP
详解PHP的Yii框架的运行机制及其路由功能
2016/03/17 PHP
PHP简单实现数字分页功能示例
2016/08/24 PHP
基于CI框架的微信网页授权库示例
2016/11/25 PHP
php 算法之实现相对路径的实例
2017/10/17 PHP
在js中使用&quot;with&quot;语句中跨frame的变量引用问题
2007/03/08 Javascript
20个非常有用的PHP类库 加速php开发
2010/01/15 Javascript
js更优雅的兼容
2010/08/12 Javascript
javascript中日期转换成时间戳的小例子
2013/03/21 Javascript
Jquery仿淘宝京东多条件筛选可自行结合ajax加载示例
2013/08/28 Javascript
在页面上用action传递参数到后台出现乱码的解决方法
2013/12/31 Javascript
javascript中hasOwnProperty() 方法使用指南
2015/03/09 Javascript
浅谈jquery点击label触发2次的问题
2016/06/12 Javascript
微信小程序 封装http请求实例详解
2017/01/16 Javascript
webpack教程之webpack.config.js配置文件
2017/07/05 Javascript
JavaScript中重名的函数与对象示例详析
2017/09/28 Javascript
在vue项目中,使用axios跨域处理
2018/03/07 Javascript
RequireJS用法简单示例
2018/08/20 Javascript
vue实现的请求服务器端API接口示例
2019/05/25 Javascript
json数据格式常见操作示例
2019/06/13 Javascript
JSONLINT:python的json数据验证库实例解析
2017/11/28 Python
Pandas 按索引合并数据集的方法
2018/11/15 Python
python3使用matplotlib绘制条形图
2020/03/25 Python
解决python中导入win32com.client出错的问题
2019/07/26 Python
python爬取Ajax动态加载网页过程解析
2019/09/05 Python
np.dot()函数的用法详解
2020/01/17 Python
Python numpy矩阵处理运算工具用法汇总
2020/07/13 Python
Python实现壁纸下载与轮换
2020/10/19 Python
Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别?
2012/06/05 面试题
集体婚礼证婚词
2014/01/13 职场文书
5.12护士节演讲稿
2014/04/30 职场文书
创业女性典型材料
2014/05/02 职场文书
彩妆大赛策划方案
2014/05/13 职场文书
实验室安全管理制度
2015/08/05 职场文书
关于python类SortedList详解
2021/09/04 Python