gpt4 book ai didi

python - 获取包含 Python 对象计算属性的字典?

转载 作者:太空宇宙 更新时间:2023-11-03 15:13:47 24 4
gpt4 key购买 nike

假设我有一个 Python 类,其中包含在构造函数中创建的属性和使用 property 装饰器创建的计算属性的混合:

class Example:

def __init__(self):
self.foo = 1

@property
def bar(self):
return 2

def baz(self, x):
return x * x

我想生成一个包含这两种属性的字典,但仅此而已。但是,如果我执行 vars(Example()) 我只会得到 foo。如果我这样做 dir(Example()) 我会得到 foobar,但 baz 和其他负载也是垃圾。

是否可以自动生成这样的字典?我想我必须重写__dict__?也许通过调用 dir 并以某种方式过滤掉无趣的部分?

我想避免手动枚举所有属性。

最佳答案

这里的根本问题是 dir 返回:

Else, return an alphabetized list of names comprising (some of) the attributes
of the given object, and of attributes **reachable** from it

但是foo不是实例的属性,它是类的属性,并且可访问> 来自实例,因此它包含在 dir 输出中,但不存在于实例的 __dict__ 中。检查示例.__dict__。 Python 中类 block 中定义的所有内容都将属于该类。但在 __init__ 方法中,您显式分配 self.foo = val,它分配给实例

考虑:

In [2]: e = Example()

In [3]: e.__dict__
Out[3]: {'foo': 1}

In [4]: Example.__dict__
Out[4]:
mappingproxy({'__dict__': <attribute '__dict__' of 'Example' objects>,
'__doc__': None,
'__init__': <function __main__.Example.__init__>,
'__module__': '__main__',
'__weakref__': <attribute '__weakref__' of 'Example' objects>,
'bar': <property at 0x104214408>})

也许最简单的解决方案是利用 dir 对属性 reachable 的感知,并结合以下过滤操作:

In [12]: list(s for s in dir(e) if not callable(getattr(e, s)) and not s.startswith('__'))
Out[12]: ['bar', 'foo']

关于python - 获取包含 Python 对象计算属性的字典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44035827/

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