2016-02-09 2 views
2

У меня есть класс Foo, содержащий переменную класса size. Я хочу рассчитать размер при первом создании объекта Foo и использовать его для всех последующих объектов, но не рассчитать размер снова. Ради содержащий все, что в Foo классе я придумал этот код:Изменение переменной класса: хорошая практика или нет? (Python)

class Foo(object): 
    size = -1 
    def __init__(self,args): 
     if Foo.size < 0: 
      Foo.size = some_calculation(args) 

В моих маленьких тестов, это то, что я хочу. Однако считается ли это хорошей практикой? Есть ли лучший способ сделать это?

+4

Может ли 'Foo.size' когда-либо рассчитывать на' <0'? Если это так, вы можете захотеть инициализировать как «Нет» и проверить «если Foo.size не имеет значения:« – Jkdc

+3

Переменные класса, безусловно, имеют свое применение, особенно для случаев, когда данные разделяются во всех экземплярах ... Итак, да, если это делает то, что вы хотите, и подходит для использования, это нормально. – deceze

+1

Считайте, что если вы так поступаете, могут возникнуть ситуации, когда вы отправляете дайвинг для 'Foo.size' в другом месте вашего кода до того, как все объекты будут инициализированы, и вы получите' AttributeError'. Чтобы избежать этой проблемы, используйте блок 'try' или инициализируйте' Foo.size' как 'None' или, возможно,' 0' как часть определения класса. –

ответ

1

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

Как сказано в комментариях, в вашем подходе нет ничего плохого. Это зависит от того, что вы хотите сделать.

Позвольте мне указать, что в будущем вы определяете подкласс, который вычисляет size в соответствии с другим правилом/начальным значением, может быть полезно обратиться к нему через self. (вместо того, чтобы достичь его через класс ')

eg

>>> class A: 
... size=1 
... def printsize(self): 
... print(self.size) 
... 
>>> class B(A): 
... size=2 
... 
>>> a=B() 
>>> a.printsize() 
2 
+0

Спасибо, я буду помнить об этом – Cantfindname

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