Python:从string访问类属性

时间:2009-07-22 18:52:14

标签: python syntax

我有一个如下课程:

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}}也工作。这样做的最佳方式是什么?

4 个答案:

答案 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]