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

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

т.е.

class A(object):
    foo = None

против

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

2 ответа

Решение

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

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,

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

Другие вопросы по тегам