python - 如何动态生成属性?

标签 python object attributes python-2.x

我使用了下面的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,像这样的调用

结果 = x.a

功能上等同于

结果 = getattr(x, "a")

其功能等同于

结果 = type(x).__getattr__(x, "a")

通常与

相同

结果 = 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/

相关文章:

delphi - 如何使用 rtti 列出属性的属性?

python - Post 请求在 Scrapy 中不起作用。在 postman 工作。我哪里错了?

python - 堆栈和优化 - 来自 hackerrank 的示例

python - 读取 csv 行并为每一行创建列表

javascript - 如何删除参数对象中的第一个参数?

c# - 使用属性调用方法

Python Sqlite3 获取Sqlite连接路径

JavaScript [对象][对象] 调试

PHP 在对象中查找值

c# - 从 Lambda 属性表达式获取自定义属性