python-3.x - Namedtuple 类名

标签 python-3.x

只是想知道当我们创建一个namedtuple对象时,为什么我们总是让新对象的名字(左边)和namedtuple对象的名字(左边)一样右边)?

我尝试了一个实验,使它们具有如下不同的名称,然后使用不同的对象名称添加字段数据,如下所示:

Running Code Example

>>> latlong = namedtuple('good', 'lat long')
>>> latlong(1, 2)
good(lat=1, long=2)
>>> good(1,2)
latlong(lat=1, long=2)

因此,当我使用 latlong 添加字段时,它返回 good(),当我使用 good 时,它返回 latlong 。为什么他们每次都返回不同的名字?他们不应该总是返回 good 的原始对象名称吗?

谢谢!
埃里克

最佳答案

作为第一个参数传递的名称是存储在命名元组中的名称,作为其 __name__ 属性 - 当您在此类元组上调用 repr 时使用. (你,或者,在这种情况下,交互式解释器 - 它进行 repr 调用以获取你打印的内容)。

您将 namedtuple 分配给的名称 - 也就是说,= 左侧的名称只是您选择在代码中使用的任何名称 - 就像您可以命名任何其他 Python 对象一样。

您甚至可以通过简单地执行以下操作来为单个 namedtuple 类调用很多名称:

N = Name = NameAndAddress = namedtuple("NameAndAddress", "name address")

您可以通过使用任何分配的名称来使用同一对象。或者您可以在一个列表中存储大量命名元组,并且不为它们中的任何一个提供明确的名称 - 就像任何其他对象一样,保存对象引用的变量名称没有区别。

这有点不幸,因为为了更好的可读性,我们希望 namedtuple 的“内部”名称与我们用来引用它的名称相同。 Python 无法干净地创建这样的赋值 - 除非它是在类体内进行的。换句话说:语言中没有机制可以让 = 右侧的表达式知道它被分配给哪个名称(在 = 左侧code>) - 因此 namedtuple 签名要求您将其名称显式键入为字符串。但尽管如此,没有任何机制或检查来验证分配的名称和内部名称是否相同。

作为旁注:如果您在类体内分配名称,Python 中有一些机制允许您“告诉”分配的对象它的名称(这将是一个类属性)。在 Python 3.5 之前,您必须在类的元类或类装饰器中执行此操作。在 Python 3.6 中,分配的对象本身可能是一个描述符,其类实现了一个名为 __set_name__ 的特殊方法。如果是这样,则在类实例化时调用该方法并传递类对象和属性名称——方法中的代码然后可以在实例中设置名称。

关于python-3.x - Namedtuple 类名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43928308/

相关文章:

Python - 检查列表中的数字是否是数字的因子

python-3.x - 为什么gzip不一致?

python-3.x - 如何使用 Python 解释自相关和偏自相关图

javascript - CRONTAB 执行 Python,使用 puppeteer 执行 Node 来进行网页抓取不起作用

python - 修复GEOJson自交点

python - 如何将从 .arff 文件加载的 arff 对象转换为 dataframe 格式?

python - 多字符串替换Python

Python:有关 Python 函数实现的信息

Python:查找作为连续平方和的回文数的有效方法

python - 欧式距离的高效计算