Имеют ли какие-либо различия в python переменные экземпляра, объявленные вне `__init __ ()`? - PullRequest
1 голос
/ 07 апреля 2019

Мне интересно, нужно ли определять переменную экземпляра класса в объявлениях класса.

Я попытался назначить новую переменную экземпляра после того, как объект (экземпляр класса) уже был создан, и похоже, что нет никакой разницы. Есть ли какие-либо предостережения в этом подходе?

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'}

Ответы [ 2 ]

1 голос
/ 07 апреля 2019

Нет разницы между объявлением self.foo в определении def __init__(self, <arguments>): и объявлением его после создания объекта.

Оба назначения имеют область действия на уровне экземпляра.

Дано -

class Context:
    i_am_a_class_variable = 'class_string'
    def __init__(self, bar):
        self.bar = bar

См. -

  1. Атрибуты класса доступны без создания экземпляра объекта.
>>> 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'
0 голосов
/ 08 апреля 2019

Говоря о том, можете ли вы присвоить значение свойству или создать новое свойство, нет никакой разницы, если вы сделаете это в init или где-либо еще после создания объекта, как в обоих случаях он добавляется в dict объекта (если вы не используете slots )

Однако, если вы хотите, чтобы ваш класс был инициализирован с желаемым состоянием (т. Е. Иметь некоторые обязательные переменные со стандартными / предустановленными значениями), вы должны поместить его в init . Поскольку init вызывается неявно, как только объект создан, ваш объект будет иметь желаемое состояние.

...