关于语法:Python:从string访问类属性

Python: access class property from string

本问题已经有最佳答案,请猛点这里访问。

我有一个如下的班级:

1
2
3
4
5
6
7
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__的功能,但也不起作用。最好的方法是什么?


如果source命名了self的任何属性,包括您示例中的other_data属性,那么x = getattr(self, source)将非常有效。


一幅画胜过千言万语:

1
2
3
4
5
6
7
8
>>> 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


稍微延长亚历克斯的回答:

1
2
3
4
5
6
7
8
9
10
11
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
[1, 2, 3]
[4, 5, 6]

然而,我个人并不认为这是一种很好的风格——getattr允许您访问实例的任何属性,包括doSomething方法本身,甚至实例的__dict__等。我建议您改为实现数据源字典,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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
[1, 2, 3]
[4, 5, 6]