通过说最初未知,我的意思是对于具有许多属性的类,我们可以决定哪些现场更改。 喜欢这个
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,我无法解决问题。
答案 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')