列出namedtuple子类的属性

Bop*_*reH 5 python attributes subclass namedtuple python-3.3

我有一个扩展了的小类namedtuple,但__dict__其实例的属性始终返回空。

Point = namedtuple('Point', 'x y')
p1 = Point(20, 15)
print(p1, p1.__dict__)
# Point(x=20, y=15) OrderedDict([('x', 20), ('y', 15)]) <--- ok

class SubPoint(Point): pass
p2 = SubPoint(20, 15)
print(p2, p2.__dict__)
# SubPoint(x=20, y=15) {} <--- why is it empty?
Run Code Online (Sandbox Code Playgroud)

p2具有属性,但__dict__为空。dir()但是,用正确列出了它们,这很奇怪。请注意,在SubPoint扩展香草类时,此工作可正常进行。

发生了什么,如何在子类实例中列出属性?

adi*_*leo 1

要了解为什么__dict__不起作用,请查看Ashwini Chaudhary 的答案。这个答案涵盖了问题的第二部分(如何列出namedtuple属性)。

要列出namedtuple属性,有_fields_asdict

>>> import collections as c
>>> Point = c.namedtuple("Point", ["x", "y"])
>>> p1 = Point(20, 15)
>>> print(p1._fields)
('x', 'y')
>>> print(p1._asdict())
{'x': 20, 'y': 15}
>>> class SubPoint(Point): pass
...
>>> p2 = SubPoint(20, 15)
>>> print(p2._fields)
('x', 'y')
>>> print(p2._asdict())
{'x': 20, 'y': 15}
Run Code Online (Sandbox Code Playgroud)

请注意,这_fields是在类上定义的,因此您还可以执行以下操作:

>>> print(SubPoint._fields)
('x', 'y')
Run Code Online (Sandbox Code Playgroud)

显然,_asdict需要一个实例才能使用这些值。

我使用Python 3.9.7作为示例,我不太确定这些东西是什么时候添加的(也许知道的人可以发表评论)。