Инициализация / объявление атрибутов в классе Python: где их разместить? - PullRequest
42 голосов
/ 18 октября 2011

Мне было интересно, как лучше всего инициализировать атрибуты объекта в Python, в теле класса или внутри функции __init__?

т.е.

class A(object):
    foo = None

против

class A(object):
   def __init__(self):
       self.foo = None

Ответы [ 2 ]

54 голосов
/ 18 октября 2011

Если вы хотите, чтобы атрибут был общим для всех экземпляров класса, используйте атрибут класса:

class A(object):
    foo = None

В результате ('foo',None) становится парой (key,value) в A.__dict__.

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

class A(object):
   def __init__(self):
       self.foo = None

Это заставляет ('foo',None) быть парой (key,value) в a.__dict__, где a=A() является экземпляром A.

2 голосов
/ 18 октября 2011

Атрибуты, определенные в определении класса, считаются переменными класса (как статические переменные в Java), тогда как атрибуты, установленные в инициализаторе, являются атрибутами экземпляра (обратите внимание на разницу между self.something = 1 и something = 1). См. этот вопрос для получения более подробной информации и этот вопрос для получения дополнительной информации. Между этими двумя случаями нет большой практической разницы, так как определение на уровне класса дает атрибуту значение по умолчанию, но если вы хотите использовать какую-то логику для установки атрибута перед использованием экземпляра объекта, вы должны сделать это в метод __init__().

...