Python:从string访问类属性

我有一个类如下:

class User: def __init__(self): self.data = [] self.other_data = [] def doSomething(self, source): // if source = 'other_data' how to access self.other_data 

我想为doSomething的源variables传递一个string,并访问同名的类成员。

我试过getattr只适用于函数(从我可以告诉),以及有User扩展dict和使用self.__getitem__ ,但这也不起作用。 什么是最好的方法来做到这一点?

x = getattr(self, source)如果source自己的任何属性(包括你的例子中的other_data x = getattr(self, source)将会工作得很好。

一张图片胜过千言万语:

 >>> class c: pass o = c() >>> setattr(o, "foo", "bar") >>> o.foo 'bar' >>> getattr(o, "foo") 'bar' 
  • getattr(x, 'y')等价于xy
  • setattr(x, 'y', v)等价于xy = v
  • delattr(x, 'y')相当于del xy

稍微延伸Alex的答案:

 class User: def __init__(self): self.data = [1,2,3] self.other_data = [4,5,6] def doSomething(self, source): dataSource = getattr(self,source) return dataSource A = User() print A.doSomething("data") print A.doSomething("other_data") 

会产生:

 [1,2,3]
 [4,5,6]

然而,我个人并不认为这是很好的风格 – getattr会让你访问实例的任何属性,包括doSomething方法本身,甚至是实例的__dict__ 。 我会build议,而不是你实现一个数据源的字典,如下所示:

 class User: def __init__(self): self.data_sources = { "data": [1,2,3], "other_data":[4,5,6], } def doSomething(self, source): dataSource = self.data_sources[source] return dataSource A = User() print A.doSomething("data") print A.doSomething("other_data") 

再次产生:

 [1,2,3]
 [4,5,6]