我有这样一个类:

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,它只适用于函数(从我可以告诉)以及有用户扩展字典和使用自我。__getitem__,但这也不工作。最好的方法是什么?


当前回答

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

其他回答

Getattr (x, 'y')等价于x.y Setattr (x, 'y', v)等价于x.y = v Delattr (x, 'y')等价于x.y

一图胜千言万语:

>>> class c:
        pass
o = c()
>>> setattr(o, "foo", "bar")
>>> o.foo
'bar'
>>> getattr(o, "foo")
'bar'

稍微扩展一下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__。我建议你实现一个数据源字典,像这样:

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]

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