【问题标题】:How do I get the name from a named tuple in python?如何从 python 中的命名元组中获取名称?
【发布时间】:2012-06-11 23:26:14
【问题描述】:

我创建一个这样的命名元组:

from collections import namedtuple
spam = namedtuple('eggs', 'x, y, z')
ham = spam(1,2,3)

然后我可以使用例如访问火腿的元素

>>> ham.x
1
>>> ham.z
3

在解释器中,

>>> ham
eggs(x=1, y=2, z=3)

但如果我只想得到“鸡蛋”怎么办?我能想到的唯一方法是

>>> ham.__repr__.split('(')[0]
'eggs'

但这似乎有点混乱。有没有更清洁的方法?

如果不诉诸私有方法就无法访问命名元组,为什么要对它们具有这种“鸡蛋”方面?

【问题讨论】:

  • 我想你的意思是spam = namedtuple('eggs', 'x, y, z')
  • 答案是 instance.__class__.__name__ 虽然...
  • 不确定我是否理解反对票。你是说如果我读得足够多,我就会得出答案吗?
  • 我没有投反对票,我只是注意到这个问题与给定的链接基本相同 - 重复。

标签: python


【解决方案1】:

可以获取类的__name__属性:

>>> type(ham).__name__
'eggs'

(这里使用the type() builtin 获取类)。

【讨论】:

  • 这样比较好,但还是要使用私有方法。如果它不是火腿对象的属性,为什么还要有“鸡蛋”部分?
  • @aaren 这不是私有方法 - 双下划线两边表明该方法 - 或者,在这种情况下,属性对于 Python 的工作方式是特殊的。为 ham 对象命名是没有意义的,因为它不是 ham 对象的一部分。这是课堂的一部分。任何属于类范围的东西都存储在类中,这是有道理的。需要类的名称 - 因为您没有使用 class 语句,所以您必须明确地将名称提供给 python。
  • @aaren 这不是 ham 对象的属性,而是它的类的属性(这又是对象的属性)。另请注意,它们既不是私有也不是方法 - 两者都是公共属性,尽管使用 double 下划线来表示魔法并避免与用户定义的名称发生冲突。
【解决方案2】:

关于命名元组属性的话题:

 >>> ham._fields
    ('x', 'y', 'z')

了解有时很有用

【讨论】:

  • 这根本不是问题的答案
【解决方案3】:

基于 python 的docnamedtuple 为您提供了一个名为“eggs”的新元组子类

所以本质上你需要类名

type(ham).__name__ 会给你类名

【讨论】:

    【解决方案4】:
    >>> ham.__class__.__name__
    'eggs'
    

    【讨论】:

    • -1。不要直接访问__class__ 属性,这是不好的做法。 type() 内置是有原因的。
    • 不同的是,没有内置函数来获取名称。你不会做x.__len__() 你会做len(x)。为什么会在这里奇怪?
    • 我不会称之为不好的做法,但我认为它很丑,也更喜欢type。至于__name__,没有等效的内置函数,所以不太一样。 (顺便说一句,在带有旧式类的 Python 2 中,两者是不同的,但是拧旧式类,它们需要死掉。)
    • @Lattyware - Because it works with old-style classes as well,这可能与该问题的 namedtuple 无关,但 obj.__class__ 更便携。
    猜你喜欢
    • 1970-01-01
    • 2021-07-04
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-01
    • 2017-11-11
    相关资源
    最近更新 更多