Инициализация/объявление атрибутов в классе Python: куда их поместить?
Мне было интересно, что было наилучшей практикой для инициализации атрибутов объектов в Python, в теле класса или внутри функции __init__
?
то есть.
class A(object):
foo = None
против
class A(object):
def __init__(self):
self.foo = None
Ответы
Ответ 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__()
.