Методы, которые возвращают значения, против методов, которые напрямую устанавливают атрибуты в Python - PullRequest
4 голосов
/ 22 августа 2011

Какой из следующих классов продемонстрирует лучший способ установить атрибут экземпляра?Должны ли они использоваться взаимозаменяемо в зависимости от ситуации?

class Eggs(object):

    def __init__(self):
        self.load_spam()

    def load_spam(self):
        # Lots of code here
        self.spam = 5

или

class Eggs(object):

    def __init__(self):
        self.spam = self.load_spam()

    def load_spam(self):
        # Lots of code here
        return 5

Ответы [ 3 ]

9 голосов
/ 22 августа 2011

Я бы предпочел второй метод.

И вот почему: Процедуры с побочными эффектами имеют тенденцию вводить временную связь. Проще говоря, изменение порядка выполнения этих процедур может нарушить ваш код. Возврат значений и передача их другим нуждающимся методам делает явным взаимодействие между методами и, следовательно, его легче рассуждать и трудно забыть / получить в неправильном порядке.

Также возвращение значения облегчает тестирование вашего метода. С возвращаемым значением вы можете рассматривать вмещающий объект как черный ящик и игнорировать внутренности объекта, что, как правило, хорошо. Это делает ваш тестовый код более надежным.

0 голосов
/ 01 октября 2011

Если вы устанавливаете атрибуты экземпляра, первый метод более Pythonic. Если вы рассчитываете промежуточные результаты, то вызовы функций вполне подойдут Обратите внимание, что второй метод не только не Pythonic, он вводит в заблуждение - он называется load_spam, но это не так!

0 голосов
/ 22 августа 2011

Я бы действительно выбрал в зависимости от ситуации. Если вы сомневаетесь, я бы выбрал вторую версию, потому что она более явная и load_spam как отсутствие (или, по крайней мере, меньше) побочных эффектов. Меньшее количество побочных эффектов обычно приводит к коду, который легче поддерживать и легче понять. Как вы знаете, нет правил без исключения. Но так я бы подошел к проблеме.

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