Ответ 1
x = getattr(self, source)
будет работать отлично, если source
называет ЛЮБЫЙ атрибут self, включая other_data
в вашем примере.
У меня есть класс вроде следующего:
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__
, но это тоже не сработает. Каков наилучший способ сделать это?
x = getattr(self, source)
будет работать отлично, если source
называет ЛЮБЫЙ атрибут self, включая other_data
в вашем примере.
Изображение на тысячу слов:
>>> 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
Расширение ответа 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]