Fluent Python2 【Chapter1_QA】
1. collections.namedtuple() 和 typing.NamedTuple()的区别
collections.namedtuple() 和 typing.NamedTuple() 是用于创建命名元组的两种不同方法,它们之间有一些区别:
-
模块来源:
collections.namedtuple()是collections模块中的函数,它是 Python 标准库的一部分。typing.NamedTuple()是typing模块中的类,用于类型提示和类型注解。
-
返回类型:
collections.namedtuple()返回一个新的命名元组类,该类是由collections.namedtuple()函数动态创建的。typing.NamedTuple()返回一个新的命名元组类型,该类型是用户定义的类。
-
语法:
collections.namedtuple()是一个函数,需要传入一个名称和一个字段列表来创建一个新的命名元组类。typing.NamedTuple()是一个类,需要继承它并定义字段的类型和名称。
-
字段定义:
- 在
collections.namedtuple()中,字段定义作为参数传递给函数,并且字段的名称存储在元组的_fields属性中。 - 在
typing.NamedTuple()中,字段定义作为类的类型提示,字段的名称存储在类属性中。
- 在
下面是两种方法的示例:
使用 collections.namedtuple():
from collections import namedtuple # 创建一个命名元组类 Point = namedtuple('Point', ['x', 'y']) # 创建命名元组实例 p1 = Point(1, 2) # 访问字段 print(p1.x, p1.y)
使用 typing.NamedTuple():
from typing import NamedTuple # 定义一个命名元组类型 class Point(NamedTuple): x: int y: int # 创建命名元组实例 p1 = Point(1, 2) # 访问字段 print(p1.x, p1.y)
总的来说,collections.namedtuple() 适用于创建简单的命名元组,而 typing.NamedTuple() 更适合于类型提示和类型注解。
2. __repr__和__str__的区别。
Here is a good example:
>>> import datetime >>> today = datetime.datetime.now() >>> str(today) '2012-03-14 09:21:58.130922' >>> repr(today) 'datetime.datetime(2012, 3, 14, 9, 21, 58, 130922)'
参考资料: What is the difference between __str__ and __repr__?

浙公网安备 33010602011771号