Подтвердить что ты не робот

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

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

то есть.

class A(object):
    foo = None

против

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

Ответ 1

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

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

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