2013-10-10 5 views
4

Когда я пишу класс, я объявляю некоторые переменные в методе __init__ и некоторые другие в других функциях. Таким образом, я обычно в конечном итоге с чем-то вроде этого:Где лучше объявлять переменные в классе Python?

class Foo: 
    def __init__(self,a, b): 
     self.a=a 
     self.b=b 
    def foo1(self,c, d) 
     sum=self.a+self.b+c+d 
     foo2(sum) 
    def foo2(self,sum) 
     print ("The sum is ", sum) 

Я нахожу этот способ немного грязный, потому что становится трудно следить за всеми переменными. Напротив, управление переменными, когда они объявлены в методе __init__, становится более простым. Таким образом, вместо прежней формы мы имели бы:

class Foo: 
    def __init__(self,a, b, c, d, sum): 
     self.a=a 
     self.b=b 
     self.c=c 
     self.d=d 
     self.sum=sum 
    def foo1(self) 
     self.sum=self.a+self.b+self.c+self.d 
     foo2(self.sum) 
    def foo2(self) 
     print ("The sum is ", self.sum) 

Какой из них вы выбрали бы и почему? Считаете ли вы, что объявление всех переменных всех функций класса в методе __init__ было бы лучшей практикой?

+1

Ваш 'foo2 (сумма)' в 'Foo.foo1' не будет выполняться, потому что у вас есть' return' заявление на линии над ним. –

+0

@MartijnPieters +1. Я удалил «возвращает» – multigoodverse

ответ

4

Есть по крайней мере три аспекта этого:

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

Итак, вы не должны выполнять какие-либо операции внутри конструктора, кроме объявления переменных. Как насчет вызова других методов класса из конструктора? – multigoodverse

+1

Я не говорю, что конструктор должен только объявлять переменные, просто говоря, что переменные, объявленные лучше, важны, а не случайны (например, промежуточные результаты, вспомогательные вары и т. Д.). – miku

5

Ваш sum является хорошим кандидатом для вычисленного значения, то есть метода, который действует как переменная класса (не метод). Это может быть сделано путем @property

class Foo(object): 
    def __init__(self, a, b): 
     self.a = a 
     self.b = b 

    @property 
    def sum(self) 
     return self.a + self.b 

f = Foo(1, 2) 
print 'The sum is' + f.sum 

http://docs.python.org/2/library/functions.html#property

+1

Интересно, что это за волшебство за это в декораторах? –

+0

см. Ссылку в моем ответе – alexvassel

+1

@alexvassel Вероятно, вы должны объяснить свой ответ более явно. – multigoodverse

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