Fluent Python2 【Chapter1_QA】

1. collections.namedtuple()typing.NamedTuple()的区别

collections.namedtuple()typing.NamedTuple() 是用于创建命名元组的两种不同方法,它们之间有一些区别:

  1. 模块来源:

    • collections.namedtuple()collections 模块中的函数,它是 Python 标准库的一部分。
    • typing.NamedTuple()typing 模块中的类,用于类型提示和类型注解。
  2. 返回类型:

    • collections.namedtuple() 返回一个新的命名元组类,该类是由 collections.namedtuple() 函数动态创建的。
    • typing.NamedTuple() 返回一个新的命名元组类型,该类型是用户定义的类。
  3. 语法:

    • collections.namedtuple() 是一个函数,需要传入一个名称和一个字段列表来创建一个新的命名元组类。
    • typing.NamedTuple() 是一个类,需要继承它并定义字段的类型和名称。
  4. 字段定义:

    • 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__?

 

posted @ 2024-03-30 14:46  AlphaGeek  阅读(20)  评论(0)    收藏  举报