gpt4 book ai didi

python - 列出 namedtuple 子类的属性

转载 作者:太空狗 更新时间:2023-10-30 01:15:17 25 4
gpt4 key购买 nike

我有一个扩展 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?

p2 有属性,但是它的 __dict__ 是空的。但是,它们使用 dir() 正确列出,这很奇怪。请注意,当 SubPoint 扩展一个 vanilla 类时,它可以正常工作。

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

最佳答案

问题是 __slots__ 仅限于定义它的类,因此基类将始终具有自己的 __dict__ 属性,除非您定义 __slots__ 还有。 (还要注意 namedtuple__dict__ 属性不是普通字典,而是 @property。)

来自 docs :

The action of a __slots__ declaration is limited to the class where it is defined. As a result, subclasses will have a __dict__ unless they also define __slots__ (which must only contain names of any additional slots).

因此,当您在子类中定义 __slots__ 时,它无法在该类中查找属性 __dict__,因此转到找到 的基类code>__dict__ 属性。

一个简单的演示:

class A:
__slots__= ('a', 'b')

@property
def __dict__(self):
print ('inside A')
return self.__slots__

class B(A):
pass

print(B().__dict__)

print ('-'*20)

class B(A):
__slots__ = ()
print(B().__dict__)

输出:

{}
--------------------
inside A
()

关于python - 列出 namedtuple 子类的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22753711/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com