Python: свойство класса доступа из строки

У меня есть класс вроде следующего:

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 extend dict и используя self.__getitem__, но это тоже не сработает. Каков наилучший способ сделать это?

Ответ 1

x = getattr(self, source) будет работать отлично, если source называет ЛЮБЫЙ атрибут self, включая other_data в вашем примере.

Ответ 2

Изображение на тысячу слов:

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

Ответ 3

  • getattr(x, 'y') эквивалентно x.y
  • setattr(x, 'y', v) эквивалентен x.y = v
  • delattr(x, 'y') эквивалентно del x.y

Ответ 4

Расширение ответа 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]