gpt4 book ai didi

python - 如何动态生成属性?

转载 作者:太空宇宙 更新时间:2023-11-04 02:15:18 26 4
gpt4 key购买 nike

我正在使用下面的 python 代码:

class A(object):
def __getattr__(self, name):
print "__getattr__ : %s" % name
setattr(self, name, A())
print self.__dict__
print getattr(self, name)

x = A()
x.a = 1 . # Works fine.
print x.a

x.b.c = 2 # Throws error.
print x.b.c

最后一部分抛出以下错误:

NoneType object has no attribute c.

谁能解释一下上面代码中的错误是什么,因为 print self.__dict__ 清楚地表明 ab 都已被插入进入对象的字典。

我的用例是拥有一个可以在需要时动态添加属性的对象。就像我应该能够使用:

x = A()
x.a = 1
x.b.c = 2
x.d.e.f.g = 3

另外,还有其他方法可以实现我的目标吗?

更新:发现错误,__getattr__应该有返回值。

正确的代码

class A(object):
def __getattr__(self, name):
print "__getattr__ : %s" % name
x = A()
setattr(self, name, x)
print self.__dict__
print getattr(self, name)
return x # getattr(self, name)

x = A()
x.a = 1 . # Works fine.
print x.a

x.b.c = 2 # Works fine.
print x.b.c

最佳答案

__getattr__ 在请求 get 属性但请求对象不可用时调用。

假设 x 没有 a,这样的调用

result = x.a

在功能上等同于

result = getattr(x, "a")

在功能上等同于

result = type(x).__getattr__(x, "a")

通常与

相同

result = x.__getattr__("a")

最后两个变体只有在 __getattr__ 绑定(bind)到对象而不是类 (which may not work) 时才会不同

正如您在此处看到的,__getattr__ 应该返回 a 应该具有的值。

也可以直接设置属性,这样以后的get请求就不会再调用__getattr__,而是直接交由Python处理。这是否有意义取决于特定的用例(在您的用例中确实如此)。

x.b.c = 2 通常在这里翻译成类似的东西

setattr(x.__getattr__("b"), "c", 2)

同样,__getattr__ 必须在此处返回设置了属性 c 的对象。

关于python - 如何动态生成属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52796205/

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