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基础之getpass模块详细介绍
Aug 10 Python
使用Python实现简单的服务器功能
Aug 25 Python
Python数据结构与算法之列表(链表,linked list)简单实现
Oct 30 Python
Python多进程库multiprocessing中进程池Pool类的使用详解
Nov 24 Python
在python里从协程返回一个值的示例
Feb 19 Python
python进程和线程用法知识点总结
May 28 Python
Python笔记之facade模式
Nov 20 Python
python实现12306登录并保存cookie的方法示例
Dec 17 Python
python反爬虫方法的优缺点分析
Nov 25 Python
python录音并调用百度语音识别接口的示例
Dec 01 Python
pygame面向对象的飞行小鸟实现(Flappy bird)
Apr 01 Python
OpenCV项目实践之停车场车位实时检测
Apr 11 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脚本的10个技巧(6)
2006/10/09 PHP
Yii2实现多域名跨域同步登录退出
2017/02/04 PHP
JS.elementGetStyle(element, style)应用示例
2013/09/24 Javascript
replace()方法查找字符使用示例
2013/10/28 Javascript
javascript记录文本框内文字个数检测文字个数变化
2014/10/14 Javascript
修复bash漏洞的shell脚本分享
2014/12/31 Javascript
JS实现IE状态栏文字缩放效果代码
2015/10/24 Javascript
基于bootstrap插件实现autocomplete自动完成表单
2016/05/07 Javascript
bootstrap输入框组使用方法
2017/02/07 Javascript
详解Node使用Puppeteer完成一次复杂的爬虫
2018/04/18 Javascript
玩转Koa之koa-router原理解析
2018/12/29 Javascript
Vue.js中该如何自己维护路由跳转记录
2019/05/19 Javascript
JavaScript实现图片放大镜效果
2019/06/27 Javascript
JS立即执行的匿名函数用法分析
2019/11/04 Javascript
如何通过javaScript去除字符串两端的空白字符
2020/02/06 Javascript
Bootstrap实现前端登录页面带验证码功能完整示例
2020/03/26 Javascript
python基础入门详解(文件输入/输出 内建类型 字典操作使用方法)
2013/12/08 Python
Python中IPYTHON入门实例
2015/05/11 Python
基于python yield机制的异步操作同步化编程模型
2016/03/18 Python
Python 'takes exactly 1 argument (2 given)' Python error
2016/12/13 Python
关于python中的xpath解析定位
2020/03/06 Python
Python开发之身份证验证库id_validator验证身份证号合法性及根据身份证号返回住址年龄等信息
2020/03/20 Python
django 连接数据库出现1045错误的解决方式
2020/05/14 Python
Python实现一个简单的递归下降分析器
2020/08/01 Python
python 装饰器的实际作用有哪些
2020/09/07 Python
使paramiko库执行命令时在给定的时间强制退出功能的实现
2021/03/03 Python
全面解析CSS Media媒体查询使用操作(推荐)
2017/08/15 HTML / CSS
Html5 webview元素定位工具的实现
2020/08/07 HTML / CSS
String、StringBuffer、StringBuilder有区别
2015/09/18 面试题
给领导的检讨书
2014/02/16 职场文书
小班幼儿评语大全
2014/04/30 职场文书
伦敦奥运会的口号
2014/06/21 职场文书
会计电算化实训报告
2014/11/04 职场文书
工伤劳动仲裁代理词
2015/05/25 职场文书
导游词之京东大峡谷旅游区
2019/10/29 职场文书
Springboot-cli 开发脚手架,权限认证,附demo演示
2022/04/28 Java/Android