namedtuple()
参考文章地址:http://www.cnblogs.com/herbert/p/3468294.html
namedtuple是继承自tuple的子类。namedtuple和tuple比,有更多更酷的特性。namedtuple创建一个和tuple类似的对象,而且对象拥有可以访问的属性。这对象更像带有数据属性的类,不过数据属性是只读的。
实例如下:
1 import collections 2 Mytuple=collections.namedtuple('Mytuple',['x','y']) 3 n=Mytuple(1,2) 4 print n.x 5 1 6 print n.y 7 2 8 print n 9 Mytuple(x=1, y=2)
Mytuple = namedtuple('TPoint', ['x', 'y']) 创建一个Mytuple类型,而且带有属性x, y.
来解释一下nametuple的几个参数:
1 import collections 2 Person = collections.namedtuple('Person','name age gender') 3 print 'Type of Person:', type(Person) 4 Bob = Person(name='Bob', age=30, gender='male') 5 print 'Representation:', Bob 6 Jane = Person(name='Jane', age=29, gender='female') 7 print 'Field by Name:', Jane.name 8 for people in [Bob,Jane]: 9 print "%s is %d years old %s" % people
以Person = collections.namedtuple(‘Person’, 'name age gender’)为例,
其中’Person’是这个namedtuple的名称,后面的’name age gender’这个字符串中三个用空格隔开的字符告诉我们,
我们的这个namedtuple有三个元素,分别名为name, age和gender。
我们在创建它的时候可以通过Bob = Person(name=’Bob’, age=30, gender=’male’)这种方式,这类似于Python中类对象的使用。
而且,我们也可以像访问类对象的属性那样使用Jane.name这种方式访问namedtuple的元素。
其输出结果如下:
1 Type of Person: <type 'type'> 2 Representation: Person(name='Bob', age=30, gender='male') 3 Field by Name: Jane 4 Bob is 30 years old male 5 Jane is 29 years old female
几个重要的方法:
1.把数据变成namedtuple类:
Mytuple = namedtuple('Mytuple', ['x', 'y']) test= [11, 22] p = Mytuple ._make(test) p Mytuple (x=11, y=22)
2. 根据namedtuple创建的类生成的类示例,其数据是只读的,如果要进行更新需要调用方法_replace.
1 >>> p 2 Mytuple(x=11, y=22) 3 >>> p.x 4 11 5 >>> p.y 6 22 7 >>> p.y=33 8 9 Traceback (most recent call last): 10 File "<pyshell#16>", line 1, in <module> 11 p.y=33 12 AttributeError: can't set attribute 13 >>> p._replace(y=33) 14 Mytuple(x=11, y=33) 15 >>> p 16 Mytuple(x=11, y=22) 17 >>>
3.将数据字典转化成namedtuple类型:注意一下p和dp是两个不同的实例,不要被都叫Mytuple给误导了!
1 >>> d={'x':44,'y':55} 2 >>> dp=Mytuple(**d) 3 >>> dp 4 Mytuple(x=44, y=55) 5 >>> p 6 Mytuple(x=11, y=22)
4.namedtuple最常用还是出现在处理来csv或者数据库返回的数据上。利用map()函数和namedtuple建立类型的_make()方法
1 EmployeeRecord = namedtuple('EmployeeRecord', 'name, age, title, department, paygrade') 2 3 import csv 4 for emp in map(EmployeeRecord._make, csv.reader(open("employees.csv", "rb"))): 5 print(emp.name, emp.title) 6 7 # sqlite数据库 8 import sqlite3 9 conn = sqlite3.connect('/companydata') 10 cursor = conn.cursor() 11 cursor.execute('SELECT name, age, title, department, paygrade FROM employees') 12 for emp in map(EmployeeRecord._make, cursor.fetchall()): 13 print(emp.name, emp.title) 14 15 # MySQL 数据库 16 import mysql 17 from mysql import connector 18 from collections import namedtuple 19 user = 'herbert' 20 pwd = '######' 21 host = '127.0.0.1' 22 db = 'world' 23 cnx = mysql.connector.connect(user=user, password=pwd, host=host,database=db) 24 cur.execute("SELECT Name, CountryCode, District, Population FROM CITY where CountryCode = 'CHN' AND Population > 500000") 25 CityRecord = namedtuple('City', 'Name, Country, Dsitrict, Population') 26 for city in map(CityRecord._make, cur.fetchall()): 27 print(city.Name, city.Population)