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扩展香草类时,此工作可正常进行。
发生了什么,如何在子类实例中列出属性?
要了解为什么__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作为示例,我不太确定这些东西是什么时候添加的(也许知道的人可以发表评论)。
| 归档时间: |
|
| 查看次数: |
1181 次 |
| 最近记录: |