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 相关文章推荐
Python3.x和Python2.x的区别介绍
Feb 12 Python
Python实现从url中提取域名的几种方法
Sep 26 Python
Python实现分割文件及合并文件的方法
Jul 10 Python
一些常用的Python爬虫技巧汇总
Sep 28 Python
Django 跨域请求处理的示例代码
May 02 Python
Tensorflow实现卷积神经网络的详细代码
May 24 Python
python安装scipy的步骤解析
Sep 28 Python
win10安装tensorflow-gpu1.8.0详细完整步骤
Jan 20 Python
Python实现企业微信机器人每天定时发消息实例
Feb 25 Python
Python中格式化字符串的四种实现
May 26 Python
Pycharm安装python库的方法
Nov 24 Python
分享7个 Python 实战项目练习
Mar 03 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
2020最新CPU的性能排名
2020/04/02 数码科技
一个php作的文本留言本的例子(三)
2006/10/09 PHP
php array_pop()数组函数将数组最后一个单元弹出(出栈)
2011/07/12 PHP
php变量作用域的深入解析
2013/06/03 PHP
php文件扩展名判断及获取文件扩展名的N种方法
2015/09/12 PHP
php 判断页面或图片是否经过gzip压缩的方法
2017/04/05 PHP
PHP实现登陆并抓取微信列表中最新一组微信消息的方法
2017/07/10 PHP
php数值计算num类简单操作示例
2020/05/15 PHP
鼠标经过的文本框textbox变色
2009/05/21 Javascript
JavaScript Event学习第二章 Event浏览器兼容性
2010/02/07 Javascript
js限制文本框为整数和货币的函数代码
2010/10/13 Javascript
JS代码同步文本框内容的实例方法
2013/07/12 Javascript
分享9个最好用的JavaScript开发工具和代码编辑器
2015/03/24 Javascript
JS实现浏览器状态栏文字从右向左弹出效果代码
2015/10/27 Javascript
快速获取/设置iframe内对象元素的几种js实现方法
2016/05/20 Javascript
jQuery+css实现非常漂亮的水平导航菜单效果
2016/07/27 Javascript
JS引用传递与值传递的区别与用法分析
2018/06/01 Javascript
react 父子组件之间通讯props
2018/09/08 Javascript
通过GASP让vue实现动态效果实例代码详解
2019/11/24 Javascript
[02:54]DOTA2英雄基础教程 撼地者
2014/01/14 DOTA
通过Python 获取Android设备信息的轻量级框架
2017/12/18 Python
基于python生成器封装的协程类
2019/03/20 Python
Python高阶函数与装饰器函数的深入讲解
2020/11/10 Python
Python调用ffmpeg开源视频处理库,批量处理视频
2020/11/16 Python
Reebok俄罗斯官方网上商店:购买锐步运动服装和鞋子
2016/09/26 全球购物
异常和异常类的概念
2014/09/12 面试题
创业计划书如何吸引他人眼球
2014/01/10 职场文书
个人授权委托书
2014/04/03 职场文书
医学专业毕业生求职信
2014/06/20 职场文书
授权委托书范文
2014/07/31 职场文书
乡镇务虚会发言材料
2014/10/20 职场文书
监考失职检讨书
2015/01/26 职场文书
欠条样本
2015/07/03 职场文书
意外事故赔偿协议书
2016/03/22 职场文书
python实现局部图像放大
2021/11/17 Python
5个实用的JavaScript新特性
2022/06/16 Javascript