Мне интересно, нужно ли определять переменную экземпляра класса в объявлениях класса.
Я попытался назначить новую переменную экземпляра после того, как объект (экземпляр класса) уже был создан, и похоже, что разницы нет. Есть ли какие-то предостережения в этом подходе?
class Context():
def __init__(self, extension):
self.extension = extension
c = Context('extension+')
print(f"before: {c.__dict__}")
c.new_var = 'new_var_content'
print(c.extension + c.new_var)
print(f"after: {c.__dict__}")
напечатано:
before: {'extension': 'extension+'}
extension+new_var_content
after: {'extension': 'extension+', 'new_var': 'new_var_content'}
c
— это не что иное, как self,
, когда вы вызываете экземпляр метод. Таким образом, выполнение c.attribute
— это явный способ выполнения self.attribute
. Обычно вы выполняете все манипуляции с экземпляром внутри метода, чтобы его можно было повторно использовать всеми экземплярами класса.
Если я правильно помню, в С# или С++ этот тип объявления не разрешен. Однако в Python это выглядит нормально.
Нет никакой разницы между объявлением self.foo
в определении def __init__(self, <arguments>):
и его объявлением после создания экземпляра объекта.
Оба назначения имеют область действия на уровне экземпляра.
Дано -
class Context:
i_am_a_class_variable = 'class_string'
def __init__(self, bar):
self.bar = bar
Видеть -
>>> Context.i_am_a_class_variable
'class_string'
__init__(self)
.>>> Context.bar
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-4-8be0704da5be> in <module>
----> 1 Context.bar
>>> instance = Context('bar')
>>> instance.bar
'bar'
>>> instance = Context('bar')
>>> instance.foo = 'foo'
>>> instance.foo
'foo'
Говоря о том, можете ли вы присвоить значение свойству или создать новое свойство, нет никакой разницы, делаете ли вы это в в этом или в любом другом месте после создания объекта, поскольку в обоих случаях оно добавляется в диктовать объекта ( если вы не используете слоты)
Однако, если вы хотите, чтобы ваш класс был инициализирован с желаемым состоянием (т. е. с некоторыми обязательными переменными со значениями по умолчанию/предустановленными), вы должны поместить его в в этом. Поскольку в этом вызывается неявно, как только объект создан, ваш объект будет иметь желаемое состояние.
Он уже создан и в
__init__
, так что никакой разницы междуextension
иnew_var
нет.