如何动态生成属性?
How to dynamically generate attributes?
我正在使用下面的 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__
清楚地表明 a
和 b
都已插入到对象的字典中。
我的用例是拥有一个对象,可以在需要时为其动态添加属性。就像我应该能够使用:
x = A()
x.a = 1
x.b.c = 2
x.d.e.f.g = 3
另外,请问还有其他方法可以实现我的目标吗?
更新:发现错误,__getattr__
应该return一个值。
正确代码
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__
绑定到对象而不是 class (which may not work)
时,最后两个变体才会不同
正如您在这里看到的,__getattr__
应该 return a
应该具有的值。
也可以直接设置属性,以后的get请求不再调用__getattr__
,直接由Python处理。这是否有意义取决于特定的用例(在您的用例中它确实如此)。
x.b.c = 2
在这里通常翻译成
setattr(x.__getattr__("b"), "c", 2)
同样,__getattr__
必须 return 此处设置了属性 c
的对象。
我正在使用下面的 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__
清楚地表明 a
和 b
都已插入到对象的字典中。
我的用例是拥有一个对象,可以在需要时为其动态添加属性。就像我应该能够使用:
x = A()
x.a = 1
x.b.c = 2
x.d.e.f.g = 3
另外,请问还有其他方法可以实现我的目标吗?
更新:发现错误,__getattr__
应该return一个值。
正确代码
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__
绑定到对象而不是 class (which may not work)
正如您在这里看到的,__getattr__
应该 return a
应该具有的值。
也可以直接设置属性,以后的get请求不再调用__getattr__
,直接由Python处理。这是否有意义取决于特定的用例(在您的用例中它确实如此)。
x.b.c = 2
在这里通常翻译成
setattr(x.__getattr__("b"), "c", 2)
同样,__getattr__
必须 return 此处设置了属性 c
的对象。