【问题标题】:Dynamic Class Attribute in Python?Python中的动态类属性?
【发布时间】:2023-03-22 10:01:01
【问题描述】:

我正在尝试为一个类编写一个函数,该函数接受一堆文件并将它们作为属性添加到类中。

现在我有一个班级foo,还有另一个班级bar。我想基本上检查一个字符串列表(这是简化的),并将这些字符串中的每一个添加为foo 的属性,并且这些属性中的每一个都属于bar 类。所以foo 有一堆bar 类型的属性。现在我已经使用 python 的__setattr__ 完成了这项工作,效果很好。真正的问题是我需要在bar 中设置一个属性,并且我需要为每个foo 属性执行此操作。

所以现在,我有一个 for 循环:

for name in list:
  self.__setattr__(name, bar(a, b, ..))
  self.name.a = 123

不幸的是,该属性被读取为“名称”,而不是列表中的值。 所以我收到如下错误:foo object has no attribute name。 我需要的是某种动态访问。我知道getattr,但据我所知,它返回一个值,我认为不适用于我的情况。你们知道什么可以在这里工作吗?

编辑:我也可以添加我需要设置为构造函数参数的东西。我不想这样做的原因是我认为它有点重载构造函数,并使它有点混乱,特别是因为参数名称会相当长。话虽如此,如果有必要,我可以这样做。

【问题讨论】:

  • 你的意思是getattr(self, name).a = 123?目前还不清楚为什么你不能将123 传递到类中,你可能有更大的结构问题。你也应该使用setattr 而不是调用__setattr__
  • 是的,你是对的,我想太多了,出于某种原因,我一直坚持self.name.attribute 的概念。

标签: python class dynamic attributes


【解决方案1】:

将 bar-instance 保存在局部变量中:

for name in list:
    bar_value = bar(a, b, ..)
    setattr(self, name, bar_value)
    bar_value.a = 123

【讨论】:

  • 啊,是的。我尝试了类似的东西,但以一种更愚蠢的方式制作。我完全忽略了这一点,因为我试图让自己把事情复杂化。
猜你喜欢
  • 2015-08-15
  • 2015-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多