我有一个如下课程:
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__
,但这并不是'{1}}也工作。这样做的最佳方式是什么?
答案 0 :(得分:213)
x = getattr(self, source)
为自己的任何属性命名, source
将完美有效,包括您示例中的other_data
。
答案 1 :(得分:150)
一张图片胜过千言万语:
>>> class c:
pass
o = c()
>>> setattr(o, "foo", "bar")
>>> o.foo
'bar'
>>> getattr(o, "foo")
'bar'
答案 2 :(得分:40)
getattr(x, 'y')
相当于 x.y
setattr(x, 'y', v)
相当于 x.y = v
delattr(x, 'y')
相当于 del x.y
答案 3 :(得分:4)
略微扩展亚历克斯的答案:
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__
之类的内容实例。我建议您实现数据源字典,如下所示:
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]