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基于scrapy采集数据时使用代理服务器的方法
Apr 16 Python
python 连接sqlite及简单操作
Jun 30 Python
Python实现绘制双柱状图并显示数值功能示例
Jun 23 Python
python调用摄像头显示图像的实例
Aug 03 Python
浅析python的优势和不足之处
Nov 20 Python
对Python3之进程池与回调函数的实例详解
Jan 22 Python
python安装numpy和pandas的方法步骤
May 27 Python
python实现字符串完美拆分split()的方法
Jul 16 Python
python读取大文件越来越慢的原因与解决
Aug 08 Python
python 生成器和迭代器的原理解析
Oct 12 Python
python爬虫实现POST request payload形式的请求
Apr 30 Python
Python基于Serializer实现字段验证及序列化
Nov 04 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/20 PHP
使用PHP函数scandir排除特定目录
2014/06/12 PHP
Javascript 检测、添加、移除样式(className)函数代码
2009/09/08 Javascript
JS中不为人知的五种声明Number的方式简要概述
2013/02/22 Javascript
jquery ready函数、css函数及text()使用示例
2013/09/27 Javascript
Javascript实现视频轮播在pc端与移动端均可
2013/09/29 Javascript
jQuery自动完成插件completer附源码下载
2016/01/04 Javascript
JavaScript对象数组如何按指定属性和排序方向进行排序
2016/06/15 Javascript
JavaScript正则表达式替换字符串中图片地址(img src)的方法
2017/01/13 Javascript
Angular.js中定时器循环的3种方法总结
2017/04/27 Javascript
利用C/C++编写node.js原生模块的方法教程
2017/07/07 Javascript
深入理解angular2启动项目步骤
2017/07/15 Javascript
jquery在启动页面时,自动加载数据的实例
2018/01/22 jQuery
JavaScript创建对象方法实例小结
2018/09/03 Javascript
vue debug 二种方法
2018/09/16 Javascript
React Hooks的深入理解与使用
2018/11/12 Javascript
vue 路由子组件created和mounted不起作用的解决方法
2019/11/05 Javascript
jQuery实现滑动星星评分效果(每日分享)
2019/11/13 jQuery
vue 自定义组件的写法与用法详解
2020/03/04 Javascript
一篇文章带你使用Typescript封装一个Vue组件(简单易懂)
2020/06/05 Javascript
[50:28]LGD女子学院第三期 DOTA2复仇之魂教学
2013/12/24 DOTA
[02:09:59]火猫TV国士无双dota2 6.82版本详解(下)
2014/09/29 DOTA
详解python的数字类型变量与其方法
2016/11/20 Python
Python编程给numpy矩阵添加一列方法示例
2017/12/04 Python
TensorFlow用expand_dim()来增加维度的方法
2018/07/26 Python
python代码 FTP备份交换机配置脚本实例解析
2019/08/01 Python
ZWILLING双立人英国网上商店:德国刀具锅具厨具品牌
2018/05/15 全球购物
麦当劳印度网上订餐:McDelivery
2020/03/16 全球购物
What's the difference between deep copy and shallow copy? (深拷贝与浅拷贝有什么区别)
2015/11/10 面试题
中专毕业生自荐信范文
2013/11/28 职场文书
殡葬服务心得体会
2014/09/11 职场文书
2016父亲节感恩话语
2015/12/09 职场文书
2016消防宣传标语口号
2015/12/26 职场文书
《搭石》教学反思
2016/02/18 职场文书
导游词之河北白洋淀
2020/01/15 职场文书
Mysql开启外网访问
2022/05/15 MySQL