Python:从string访问类属性

152 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
Run Code Online (Sandbox Code Playgroud)

我想传入源变量的字符串doSomething并访问同名的类成员.

我已经尝试过getattr只能在函数上工作(从我能说的)以及User扩展dict和使用self.__getitem__,但这也不起作用.做这个的最好方式是什么?

Ale*_*lli 234

x = getattr(self, source)如果source命名自己的任何属性,包括other_data在你的例子中,它将完美地工作.

  • (意识到这是一个旧线程)。我感到困惑/总是因为命令而忘记了这一点。如果我想从字典中获取一个值,我可以说:myDict.get('keyy'),因此我希望属性以相同的方式工作:myObject.getattr('attr_name')。但是相反,他们将对象作为第一个参数...可以做,但是明显的不一致是我遇到麻烦的原因。 (3认同)

Rob*_*ney 161

一张图片胜过千言万语:

>>> class c:
        pass
o = c()
>>> setattr(o, "foo", "bar")
>>> o.foo
'bar'
>>> getattr(o, "foo")
'bar'
Run Code Online (Sandbox Code Playgroud)

  • 我特别喜欢这个答案,因为它简单地说明了 getattr() 函数也可以在类方法之外工作。 (6认同)

Yas*_*Yas 44

  • getattr(x, 'y') 相当于 x.y
  • setattr(x, 'y', v) 相当于 x.y = v
  • delattr(x, 'y') 相当于 del x.y

  • @user2284570:那你的情况怎么样? (3认同)

Mar*_*kus 5

稍微扩展亚历克斯的回答:

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")
Run Code Online (Sandbox Code Playgroud)

将产生:

[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")
Run Code Online (Sandbox Code Playgroud)

再次产生:

[1, 2, 3]
[4, 5, 6]