2012-05-31 4 views
0

В приведенном ниже коде класс User должен получить доступ к функции get_user внутри экземпляра класса WebService, так как он содержит другие функции, необходимые для аутентификации с веб-сервером (last.fm). Фактический код: here.Доступ к функциям другого класса без ссылки в каждом случае?

class WebService: 

    def __init__(self, key): 
     self.apikey = key 

    def get_user(self, name): 
     pass # Omitted 

class User: 

    def __init__(self, name, webservice): 
     self.name = name 
     self.ws = webservice 

    def fill_profile(self): 
     data = self.ws.GetUser(self.name) 
     # Omitted 

Проблема в том, что ссылка должна храниться внутри каждого «пользователя». Есть ли другой способ сделать это? Или это только я, чрезмерное поведение, и так оно и работает в реальном мире?

+0

Почему пользователь 'fill_profile' пользователя? Похоже, что имеет смысл иметь UserFactory, который вызывает службу (или просто обрабатывает ответ службы) и возвращает пользователя. –

+0

Получить пользователь может вернуть объект тоже Я просто поместил фактическую логику заполнения атрибутов внутри него, потому что мне казалось, что 'User' нужно будет обрабатывать данные, так как есть другие функции (например,' get_top_albums' и 'get_friends') Должны ли каждая такая функция получить свой собственный индивидуальный класс? –

+1

I второй @gilesc, когда GetUser возвращает пользователя. Что касается обработки таких вещей, как get_top_albums и get_friends, это зависит от того, как вы хотите смоделировать систему. Если вы не хотите кэшировать данные локально, я бы сказал, что просто вызывайте службу каждый раз с идентификатором пользователя. Если вы хотите кэшировать данные локально, вы можете передать объект User методу в WebService, а затем запустите этот элемент для пользователей. Вы должны принять дизайнерское решение, хотя либо имеете WebService, либо User (что, вероятно, было бы лучше), или просто UserWebService. –

ответ

2

В соответствии с запросом: Что касается обработки таких вещей, как get_top_albums и get_friends, это зависит от того, как вы хотите смоделировать систему. Если вы не хотите кэшировать данные локально, я бы сказал, что просто вызывайте службу каждый раз с идентификатором пользователя. Если вы хотите кэшировать данные локально, вы можете передать объект User методу в WebService, а затем запустите этот элемент для пользователей. Вы должны принять дизайнерское решение, хотя либо имеете WebService, либо User (что, вероятно, было бы лучше), или просто UserWebService.

2

Вы можете сделать ссылку a static variable, если объект веб-сервиса одинаковый для всех пользователей.

синтаксис:

class User: 
    webservice = ... 
... 

Вы тогда даже сможете получить к нему доступ из User экземпляров, но не назначать ему таким образом, что требует User.webservice синтаксиса.

Вы также получаете хорошие альтернативы дизайна, предлагаемые в комментариях.

Смежные вопросы