在Python中搜索更短的方法来增加最初未知的属性

时间:2014-01-17 09:44:27

标签: python

通过说最初未知,我的意思是对于具有许多属性的类,我们可以决定哪些现场更改。 喜欢这个

class Foo:
    a = 0
    b = 0
    c = 0

f = Foo()

现在我们要通过编写以下内容来更改实例的一个属性:

# we do a lot of things and get
attr_name = 'a' # well it may be others like 'b' or 'c'
setattr(obj, attr_name, getattr(obj, attr_name) + 1)

我个人认为这条线不是那么整洁。我想知道是否有更好的方式

我知道我们可以通过

来实现它
obj.__dict__[attr_name] += 1

但我不知道触摸dict是否是一个好主意

更新1:抱歉我弄错了,我打算写

class Foo:
    def __init__(self):
        self.a = 0
        self.b = 0
        self.c = 0

更新2:我需要解释为什么我坚持上课而不是整洁的词典

事实上我正在使用peewee开发一个应用程序。因此,要访问行的一列,它会将其保存为实例中的属性。所以我有这个结构。由于Peewee不支持DictField,我无法解决问题。

2 个答案:

答案 0 :(得分:1)

第一个问题是,你为什么要使用一个dict会更好,更快,更整洁的类。

其次,因为它是

setattr(obj, attr_name, getattr(obj, attr_name) + 1)

完全没问题,你可以稍微扩展一下,但那只是语义。

编辑:回复您的修改。

如果你正在使用pewee,你正在使用sql后端开发一些东西。不要在关系数据库中使用动态列。对列进行硬编码可能更好,或者您可能想要考虑使用这些值存储json文档。

答案 1 :(得分:0)

正如评论中所指出的,最好的解决方案是使用不同的数据结构(例如dict)来支持这种开箱即用的操作。

或者,您可以将解决方案定义为一种功能,使其更具表现力:

def inc_attr(obj, attr):
    setattr(obj, attr, getattr(f, attr) + 1)


inc_attr(f, 'a')