如何使用getattr/setattr在运行时递增一个属性?

7

我有一个包含十个不同计数器的类。我需要在运行时递增其中一个或另一个计数器,并且递增方法会告诉它要递增的计数器的名称。

我想知道是否有比这更简洁的方法:

def increment(self, name):
    """Increments a counter specified by the 'name' argument."""
    setattr(self, name, getattr(self, name) + 1)
  • 我并不太担心竞态条件等问题。
  • 不,你不能改变函数的调用方式。显然,实际代码比这个例子复杂得多。

是否可能拥有一个名称到计数器的字典? - PrettyPrincessKitty FS
如下所述,在下面的答案评论中指出 - 不,您没有计数器字典。 - Idan Gazit
1个回答

6
你可以将计数器存储在字典中,而不是属性中。
或者,你可以使用:
def increment(self, name):
    """Increments a counter specified by the 'name' argument."""
    self.__dict__[name] += 1

这取决于您是否认为这更“清晰”。


我无法更改计数器的存储方式;它们是 Django 模型中的字段。不过,__dict__ 技巧很不错。 - Idan Gazit
当然,在<obj>.__dict__中拥有计数器就是将它们存储在字典中。 - martineau
1
嗯,访问__dict__感觉有点不太好,但在这种情况下似乎它是获取/设置属性的唯一选择。不过还是谢谢你的建议! - Idan Gazit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接