Python:从字符串访问类属性

我有这样一个类:

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中的源变量传递一个字符串,并访问同名的类成员。

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

180738 次浏览

如果source命名self的任何属性,包括你的例子中的other_data,那么x = getattr(self, source)将完美地工作。

稍微扩展一下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")
< p >将产生:< >之前 [1,2,3] [4,5,6] < / pre > < / p >

然而,我个人认为这不是很好的风格——getattr将允许你访问实例的任何属性,包括doSomething方法本身,甚至实例的__dict__。我建议你实现一个数据源字典,像这样:

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")
< p >再次屈服:< >之前 [1,2,3] [4,5,6] < / pre > < / p >

一图胜千言万语:

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