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]