Объектно-ориентированный дизайн Python; Возврат, установка переменной экземпляра или оба - PullRequest
1 голос
/ 12 августа 2010

Хорошо, у меня есть код, который сводится к шаблону, подобному этому

class Foo(object):
def get_something1(self):
    # in the actual code it asks a web server but here I replaced that with "foo_something1" instead of the code from a web server
    self.something1 = "foo_something1"

def get_something2(self):
    # needs the result of get_something1; right now I have it get it by instance variable like so
    self.something2 = self.something1 + "_something_2"

Мой вопрос заключается в том, должен ли я делать вышеупомянутое (методы, получающие то, что им нужно, через переменные экземпляра) или с помощью таких аргументов; также я должен возвращать что-то1 и что-то2 в методах get_ *?

class Foo(object):
def get_something1(self):
    # in the actual code it asks a web server but here I replaced that with "foo_something1" instead of the code from a web server
    self.something1 = "foo_something1"

def get_something2(self, something_1):
    # needs the result of get_something1; right now I have it get it by instance variable like so
    self.something2 = something1 + "_something_2"

Теперь в моем коде методы возвращают deferreds (twisted); Прямо сейчас, когда deferreds срабатывает, он устанавливает переменные экземпляра и возвращает None; В реальном коде у меня есть другая функция, которая проверяет, истек ли что-то1 или что-то2; Я обновляю их, что вызывает проблему, потому что я обновляю это так ...

d = self.get_something1()
##d.addCallback(self.get_something2) # errors because it gets the argument None (so I do below)
d.addCallback(lambda ignored: self.get_something2())# problem the deferred for get_something2 is inaccessible

Так что сейчас код обновления либо уродлив, либо заполнен ошибками, либо и то, и другое. Таким образом, у меня есть ощущение, что я делаю что-то либо: а) не питоническое, либо б) не перекрученное, либо в) какое-то другое плохое решение.


Спасибо за ответы, но они не будут работать, потому что функции возвращают отложенные значения, а не фактическое значение (в противном случае его придется заблокировать).

1 Ответ

4 голосов
/ 12 августа 2010

Не используйте get_* методы. В Python лучше использовать свойства:

class Foo(object):
    @property
    def something1(self):
        # in the actual code it asks a web server but here I replaced that with "foo_something1" instead of the code from a web server
        return "foo_something1"
    @property
    def something2(self):
        # needs the result of get_something1; right now I have it get it by instance variable like so
        return self.something1 + "_something_2"

Обратите внимание, что когда something1 является свойством, self.something1 (без скобок!) Вызывает соответствующую функцию Foo.something1.

Если у вас есть рабочий код, вы можете увидеть, как используется something2. Если у вас есть оба

    @property
    def something2(self):
        return self.something1 + "_something_2"

    @property
    def something3(self):
        return self.otherthing1 + "_something_2"

Тогда вы можете захотеть изменить код для использования

    def something2(self,prefix):
        return prefix+"_something_2"

Мы недостаточно знаем о вашей ситуации, чтобы сказать вам, что лучше. Но ответ может стать очевидным для вас, когда вы увидите шаблоны использования вашего рабочего кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...