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写入数据到MP3文件中的方法
Jul 10 Python
对Python通过pypyodbc访问Access数据库的方法详解
Oct 27 Python
Python3字符串encode与decode的讲解
Apr 02 Python
python pyinstaller 加载ui路径方法
Jun 10 Python
python画图把时间作为横坐标的方法
Jul 07 Python
Python实现的企业粉丝抽奖功能示例
Jul 26 Python
python实现读取excel文件中所有sheet操作示例
Aug 09 Python
关于python3中setup.py小概念解析
Aug 22 Python
python scipy卷积运算的实现方法
Sep 16 Python
使用Python实现正态分布、正态分布采样
Nov 20 Python
python几种常用功能实现代码实例
Dec 25 Python
Jupyter 无法下载文件夹如何实现曲线救国
Apr 22 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
咖啡店都有些什么常规豆子呢?有什么风味在里面
2021/03/04 咖啡文化
PHP类中的魔术方法(Magic Method)简明总结
2014/07/08 PHP
php之curl设置超时实例
2014/11/03 PHP
深入浅出php socket编程
2015/05/13 PHP
PHP MPDF中文乱码的解决方式
2015/12/08 PHP
php获取本机真实IP地址实例代码
2016/03/31 PHP
Yii2框架数据验证操作实例详解
2018/05/02 PHP
PHP实现数组转JSon和JSon转数组的方法示例
2018/06/14 PHP
TP3.2框架分页相关实现方法分析
2020/06/03 PHP
关于Anemometer图形化显示MySQL慢日志的工具搭建及使用的详细介绍
2020/07/13 PHP
如何判断图片地址是否失效
2007/02/02 Javascript
EasyUI中的tree用法介绍
2011/11/01 Javascript
javascript制作坦克大战全纪录(1)
2014/11/27 Javascript
javascript中clipboardData对象用法详解
2015/05/13 Javascript
jquery实现图片水平滚动效果代码分享
2015/08/26 Javascript
jquery悬浮提示框完整实例
2016/01/13 Javascript
简单实现jQuery进度条轮播实例代码
2016/06/20 Javascript
利用types增强vscode中js代码提示功能详解
2017/07/07 Javascript
Vue组件之Tooltip的示例代码
2017/10/18 Javascript
vue项目添加多页面配置的步骤详解
2019/05/22 Javascript
python数组过滤实现方法
2015/07/27 Python
pytorch读取图像数据转成opencv格式实例
2020/06/02 Python
Django生成数据库及添加用户报错解决方案
2020/10/09 Python
Chain Reaction Cycles俄罗斯:世界上最大的在线自行车商店
2019/08/27 全球购物
什么是触发器(trigger)? 触发器有什么作用?
2013/09/18 面试题
应届生财务管理求职信
2013/11/06 职场文书
九月份红领巾广播稿
2014/01/22 职场文书
称象教学反思
2014/02/03 职场文书
委托书范本
2014/04/02 职场文书
法制宣传月活动总结
2014/04/29 职场文书
高中毕业典礼演讲稿
2014/09/09 职场文书
2014客服代表实习自我鉴定
2014/09/18 职场文书
党员自我剖析材料范文
2014/10/06 职场文书
单身申明具结书
2015/02/26 职场文书
应届毕业生的自我评价
2019/06/21 职场文书
单机多实例部署 MySQL8.0.20
2022/05/15 MySQL