python: доступ к переменной экземпляра с использованием имени, содержащего переменную - PullRequest
6 голосов
/ 22 декабря 2011

в python Я пытаюсь получить доступ к переменной экземпляра, где мне нужно использовать значение другой переменной для определения имени: Пример Переменная экземпляра: user.remote.directory, где она указывает на значение 'servername: / mnt/ ..... 'и пользовательская часть содержит идентификатор пользователя, такой как joe.remote.directory

из другого класса. Мне нужно иметь доступ к joe.remote.directory с помощью переменной, котораясодержит идентификатор пользователя joe.Я пробовал variable.remote.directory, но он не работает, какие-либо предложения?

Ответы [ 3 ]

12 голосов
/ 22 декабря 2011

Не совсем уверен, что вы хотите, но я думаю, что getattr(obj, 'name') может помочь. Смотри http://docs.python.org/library/functions.html#getattr

5 голосов
/ 22 декабря 2011

Вы можете ссылаться на переменную экземпляра с именем name объекта obj следующим образом:

obj.__dict__['name']

Следовательно, если у вас есть другая переменная prop, которая содержит имя переменной экземпляра, на которую вы хотите сослаться, вы можете сделать это следующим образом:

obj.__dict__[prop]

Если вы обнаружите, что вам нужны эти функции, вам следует спросить себя, не является ли на самом деле хорошим обстоятельством использование экземпляра dict.

1 голос
/ 22 декабря 2011

Я бы посоветовал вам создать дополнительный пользовательский объект, который вы передаете соответствующим объектам или функциям по мере необходимости. Вы крайне расплывчаты, поэтому трудно дать вам более практический совет.

Пример:

class User:
   def __init__(self, name, uid=None, remote=None, dir=None):
       self.name = name
       self.uid = uid
       self.remote = remote
       self.directory = dir

   def get_X(self)
       ...

   def create_some_curios_String(self):
       """ for uid = 'joe', remote='localhost' and directory = '/mnt/srv'
           this method would return the string:
           'joe@localhost://mnt/srv'
       """
       return '%s@%s:/%s' % (self.uid, self.remote, self.directory)


class AnotherClass:
    def __init__(self, user_obj):
        self.user = user_obj

class YetAnotherClass:
    def getServiceOrFunctionalityForUser(self, user):
        doWhatEverNeedsToBeDoneWithUser(user)
        doWhatEverNeedsToBeDoneWithUserUIDandRemote(user.uid, user.remote)

joe = User('Joe Smith', 'joe', 'localhost', '/mnt/srv')
srv_service = ServerService(joe.create_some_curios_String())
srv_service.do_something_super_important()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...