《深入理解python特性》和《流畅的python》 都提到了nametuple, 前者更是说这个有多吊,, 我硬是没看出来,哪里让人感到惊艳???
一些操作
from collections import namedtuple
Car = namedtuple('Car', ['color', 'mileage'])
# Car = namedtuple('Car', 'color mileage')
# 也可以字符串格式传值, 内部通过split分割
my_car = Car('red', 12345)
print(my_car.color) # 可以直接.出属性值
print(my_car[1]) # 也可以通过索引取出属性值
# ########################################
# 解包
color, mileage = my_car
print(color, mileage) # red 12345
print(*my_car) # 通过* 解包 red 12345
# ########################################
# 直接打印my_car
print(my_car)
# Car(color='red', mileage=12345) 返回的值也十分友好
值得注意的是, nametuple也是元组, 是不可变类型!当试图更改属性值时, 会报错
from collections import namedtuple
Car = namedtuple('Car', ['color', 'mileage'])
my_car = Car('red', 12345)
my_car.color = 'blue'
子类化nametuple
可以像其他类一样扩展namedtuple定义的类
from collections import namedtuple
Car = namedtuple('Car', ['color', 'mileage'])
class MyCarWithMethods(Car):
def hexcoloe(self):
if self.color == 'red':
print('#ff0000')
else:
return print('#000000')
c = MyCarWithMethods('red', 1234)
c.hexcoloe()
可以实现类的继承, 并通过._fields 添加新的字段
from collections import namedtuple
Car = namedtuple('Car', ['color', 'mileage'])
ElectricCar = namedtuple('ElectricCar', Car._fields + ('charge',))
print(ElectricCar('red', 1234, 45.0))
# ElectricCar(color='red', mileage=1234, charge=45.0)
除了内置的_fields方法, 还有其他的内置方法
1) _asdict()
转成字典格式
from collections import namedtuple
Car = namedtuple('Car', ['color', 'mileage'])
my_car = Car('red', '12345')
print(my_car)
# Car(color='red', mileage='12345')
print(my_car._asdict())
# OrderedDict([('color', 'red'), ('mileage', '12345')])
2)_replace()
创建一个元组的副本, 并可以替换一些字段, 注意的是原来的不变
from collections import namedtuple
Car = namedtuple('Car', ['color', 'mileage'])
my_car = Car('red', '12345')
print(my_car) # Car(color='red', mileage='12345')
print(my_car._replace(color='blue')) # Car(color='blue', mileage='12345')
print(my_car) # Car(color='red', mileage='12345')
3)_make()
用来从序列或迭代对象中创建namedtuple的新实例
from collections import namedtuple
Car = namedtuple('Car', ['color', 'mileage'])
print(Car._make(['black', 9999]))