我的 init 功能中包含设置默认值列表。这些默认值都是实例变量。例如,
self.set_acqmode = 1
self.set_readmode = 4
self.set_triggermode = 0
我在这个类中有一个函数,我只想通过传递一个名字和一个值作为参数来改变这些默认设置。例如,
def change_setting(self, setting, *arg):
访问和更改正确的实例变量的pythonic方法是什么。我尝试使用 vars()和 dict 来查看这些变量,但前者只显示了类函数,后者需要引用类的实例(这还不存在,因为这是在课堂内)。
(如果有更好的方法可以在不搜索变量的情况下执行此操作,我仍然想知道如何查看它们,只是出于兴趣。)
答案 0 :(得分:4)
使用setattr
:
def change_setting(self, setting, *arg):
setattr(self, setting, arg)
答案 1 :(得分:1)
您当然可以使用__dict__
:
>>> class Test(object):
def __init__(self):
self.x = 1
def set(self, attr, val):
self.__dict__[attr] = val
>>> a = Test()
>>> a.set('x', 2)
>>> a.x
2
答案 2 :(得分:1)
setattr
会奏效。但是你必须要问,如果你正在经历所有这些麻烦来重写setattr,你甚至会以正确的方式做到这一点吗?
如果你只想要一些任意的钥匙和值 - 嗯,这是一本字典,你应该这样使用它。如果您需要自定义行为,请覆盖__getitem__
/ __setitem__
。
如果你真的需要属性,那么父函数就没有理由不做
myobj.set_triggermode = value
而不是过于复杂的
myobj.change_setting('triggermode', value)
所以你应该这样做。即使你出于某种原因想要这样做 - 使用kwargs而不是args,可能更接近你想要的。
答案 3 :(得分:0)
您可以在类的名称上使用__dict__
,而无需实例化该类的对象。例如:
print myClass.__dict__.keys()
:: edit ::当然,如果你的编程很严格,你可以考虑使用__slots__
,在这种情况下你将自己预先定义你班级的所有实例变量。