gpt4 book ai didi

Python递归地__getattribute__

转载 作者:行者123 更新时间:2023-11-28 23:07:02 25 4
gpt4 key购买 nike

我需要实现这样的行为:

obj.attr1.attr2.attr3 --> obj.attr1__attr2__attr3

看来我必须重写 obj 的类 __getattribute__ 并以某种方式使用 python 描述符。

更新:

我有一个 Django 项目。

obj 是 django-haystack 的 SearchResult 实例,它包含大量来自 django 模型的非规范化数据(user__nameuser__address),我需要访问它作为result.user.name 出于兼容性原因。

更新 THC4k 的回答:

如果我有:

class Target(object):
attr1 = 1
attr1__attr2__attr3 = 5

>>> proxy.attr1
1
>>> proxy.attr1.attr2.attr3
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'int' object has no attribute 'attr2'

任何帮助将不胜感激。

最佳答案

如果你有属性名称列表,你可以使用 itertools() 函数(在 python-3.x functools.reduce() 中)和getattr() 内置函数:

这是一个例子:

In [1]: class A:
...: def __init__(self):
...: self.a1 = B()
...:

In [2]: class B:
...: def __init__(self):
...: self.b1 = C()
...:

In [3]: class C:
...: def __init__(self):
...: self.c1 = 7
...:

In [4]: from functools import reduce
In [5]: reduce(getattr, [A(), 'a1', 'b1', 'c1'])
Out[5]: 7

关于Python递归地__getattribute__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4247036/

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