python class namedtuple 效率_菜鸟世界 -python进阶之 namedtuple
1、namedtuple
tuple是不可变序列,当你不希望外界可以随意的改变你的函数返回值的时候,不妨将你的返回值以tuple的形式返回,tuple还可以做为字典的key,这些都是tuple的独到之处,此外,由于存储的方式不同,相同元素的tuple 要比list更快,使用的内存更少。
tuple虽然有这么多优点,但是呢,在使用的时候,你不得不用下角标来访问它的元素,这样对于代码的可读性来说是一种折损。
namedtuple弥补了tuple的这一缺陷,使得你可以像使用对象属性那样去访问数据
2、示例
2.1 代码
# coding=utf-8
from collections import namedtuple
Book = namedtuple('Book', ['name', 'price', 'count'])
book1 = Book(name='python', price=100.0, count=10)
print book1
print book1.name
print book1.price
print book1.count
2.2 如何创建
在上面的这段代码中,首先定义了一个namedtuple,第一个参数指定了它的类型,第二个参数则指定了字段名称,第二个参数除了写成list的形式,还可以写成字符串的形式,以空格分割,例如
Book = namedtuple('Book', 'name price count')
2.3 属性不可改变
如果你试图改变book1对象的某个属性,程序会直接报错的,因为它是一个特殊的tuple
2.4 更便捷的赋值过程
对于上面代码中的属性赋值过程,你可能会感到有些为难,因为如果字段特别多,那么一个一个的写代码去赋值就变得非常繁琐,如果你手里拥有的数据是一个字典,那么还可以这样去创始化它
book_dict = {
'name': 'c++',
'price': 99,
'count': 10
}
book2 = Book(**book_dict)
print book2
3、 namedtuple究竟是什么
不妨先打印一下Book
print Book
得到的结果是
这说明, namedtuple('Book', 'name price count') 返回的是一个类,Book恰好是我们传入的第一个参数,你可以将第一个参数修改成其他单词,然后再打印观察效果就会明白,第一个参数定义的是类的名字
深入namedtuple 的实现一探究竟
在 collections.py 文件中的293行开始,是对namedtuple的定义,注意看 356行的 class_definition 和 374 行的 exec class_definition in namespace
356行都是对属性的处理,356行,将这些数据整合成一个字符串,374行则对这个字符串进行了执行,或者说编译,得到的就是一个类
那么这个类又是如何生成的呢?
293行定义了类的模板
_class_template = '''\
class {typename}(tuple):
'{typename}({arg_list})'
__slots__ = ()
_fields = {field_names!r}
def __new__(_cls, {arg_list}):
'Create new instance of {typename}({arg_list})'
return _tuple.__new__(_cls, ({arg_list}))
@classmethod
def _make(cls, iterable, new=tuple.__new__, len=len):
'Make a new {typename} object from a sequence or iterable'
result = new(cls, iterable)
if len(result) != {num_fields:d}:
raise TypeError('Expected {num_fields:d} arguments, got %d' % len(result))
return result
def __repr__(self):
'Return a nicely formatted representation string'
return '{typename}({repr_fmt})' % self
def _asdict(self):
'Return a new OrderedDict which maps field names to their values'
return OrderedDict(zip(self._fields, self))
def _replace(_self, **kwds):
'Return a new {typename} object replacing specified fields with new values'
result = _self._make(map(kwds.pop, {field_names!r}, _self))
if kwds:
raise ValueError('Got unexpected field names: %r' % kwds.keys())
return result
def __getnewargs__(self):
'Return self as a plain tuple. Used by copy and pickle.'
return tuple(self)
__dict__ = _property(_asdict)
def __getstate__(self):
'Exclude the OrderedDict from pickling'
pass
{field_defs}
'''
这正是奥妙所在,nametuple根据我们传入的两个参数,格式化了这段字符串,然后exec 这段字符串,就生成了一个类,这个类继承了tuple,而后,我们用这个类创建对象
python class namedtuple 效率_菜鸟世界 -python进阶之 namedtuple相关推荐
- python数据分析相关论文_菜鸟学Python|数据分析精华文章大集合
原标题:菜鸟学Python|数据分析精华文章大集合 这是菜鸟学Python的第123篇原创文章 Python的数据分析是我比较喜欢的一个方向,因为可以探索数据里面的秘密,加上可视乎会非常漂亮,但是里面 ...
- python encoding报错_菜鸟世界 -docker 环境下解决python 的 UnicodeEncodeError 错误
1. 问题描述 使用docker部署python的web服务,框架使用flask,服务部署以后进行测试,服务端报出UnicodeEncodeError 我用的python版本是3.6,按理说,对字符编 ...
- python经典类新式类_菜鸟世界 -python进阶---新式类与经典类
1.什么是新式类,什么是经典类 #coding=utf-8 class A: pass class B(object): pass A是经典类,B是新式类,这是Python2.x 里所特有的现象,之所 ...
- python调用有道词典_菜鸟上手Python最有野心的库Asyncio
Asyncio是Python中非常牛逼的一个异步并发库,比较复杂不太好理解!从Py3.4之后开始加入这个内置并发库,一举解决了Python中高并发的问题.它提供了一整套异步IO模型的编程接口,可以说它 ...
- python xlwings追加数据_大数据分析Python库xlwings提升Excel工作效率教程
原标题:大数据分析Python库xlwings提升Excel工作效率教程 Excel在当今的企业中非常非常普遍.在AAA教育,我们通常建议出于很多原因使用代码,并且我们的许多数据科学课程旨在教授数据分 ...
- python天气查询运行过程_菜鸟玩Python|制作天气查询软件
原标题:菜鸟玩Python|制作天气查询软件 开发环境 Python3 PyQt5 requests 准备工作 首先要获取不同城市对应的天气代码,可以从 https://www.heweather.c ...
- python 一亩三分地_攻防世界逆向新手训练
本来是搞Web的(虽然菜的抠脚),但是战队缺reverse和pwn的人,正好自己对这方面也很有兴趣,于是就转了方向.刚学几天,先做上几道攻防世界的新手训练题.把自己做题的过程和学到的知识记录下来.由于 ...
- python相关工作岗位_西安掌握Python有哪些工作岗位能够选择
自从20世纪90年代初Python语言诞生至今,它逐渐被广泛应用于处理系统管理任务和Web编程.Python已经成为备受欢迎的程序设计语言之一. 大家或许更想知道学完Python后,都可以有哪些发展方 ...
- python变量定义大全_详解python变量与数据类型
这篇文章我们学习 Python 变量与数据类型 变量 变量来源于数学,是计算机语言中能储存计算结果或能表示值抽象概念,变量可以通过变量名访问.在 Python 中 变量命名规定,必须是大小写英文,数字 ...
最新文章
- php artisan常用方法
- QCustomplot控件设备背景图片(Qt图片自适应控件大小),并且设置绘图区域颜色透明
- git bash 操作文件及文件夹命令
- PHP获取用户地址方法
- java join yield_java中join和yield有什么区别?
- 科沃斯机器人阿尔法怎么样_科沃斯阿尔法扫地机器人,实用的才是最好的
- 双十一要来了,设计没思路看看案例
- php insert方法,lInsert 命令/方法/函数
- 将 30 万行代码从 Flow 迁移到 TypeScript 是一种怎样的体验?
- 高级Linux Kernel Inline Hook技术分析与实现
- 建设自己拥有的B2C网站一般需要什么样的插件以及大体花费
- 利用vbs读取XML中的某个指定子叶节点 (转)
- mysql各种key_SQL中的各种键
- 金蝶KIS专业版13.0视频教程
- 和秋叶一起学Excel 阿里云盘
- 自动驾驶汽车技术介绍【硬件+软件】
- 把VOB格式转换成其它格式的工具
- RLC电阻电容电感基础知识——电容篇
- 小猫爪:嵌入式小知识10-I2S,TDM,PCM等音频格式详解
- 免费OCR图片文字识别小工具,一键提取图片中文字,支持多语言翻译和发票识别
热门文章
- Handlebars的使用方法及技巧
- C++长整型(long long)64位整型耗时问题
- AppleScript 小试牛刀
- 【网络编程】大端模式和小端模式
- 看不到 虚拟打印机 adobe pdf printer
- 整理了70个Python实战项目案例,教程+源码+笔记。从基础到深入
- uoj #213.【UNR #1】争夺圣杯 单调栈
- 一位3年测试工程师的焦虑:月薪还不到3W,真的很担心被后面的小年轻挤掉......
- 微信小程序实现蓝牙打印(图片、二维码、文字)
- 支付宝小程引入 SJS