Когда создаются свойства класса python

class Foo:
 bar = 1
 ......etc.

Я знаю, когда создание экземпляра, бар создается до __init__, Я хочу знать, если это первое, что нужно создать свойство bar при создании экземпляр для Foo. Кроме того, панель уже существует в памяти до создания любого экземпляра?

3 ответа

Помните, что в Python class является исполняемым оператором (тоже есть def и import). Поэтому ответ на ваш вопрос заключается в том, что bar создается, когда выполняется оператор class.

В частности, когда выполняется оператор class, тело класса выполняется в пространстве имен, которое обычно равно dict. Когда тело закончило выполнение объекта класса, создается с копией полученного dict в качестве атрибута __dict__ для класса. В этом случае dict содержит все имена, связанные внутри тела класса bar=1, но также и любые функции, определенные в классе.

Экземпляры, когда они созданы, не получают копию bar, они просто возвращаются к классу. При поиске имени в экземпляре Python выглядит как в экземпляре __dict__, так и в классе __dict__.


Эти свойства хранятся в __dict__ самого класса. Они никогда существуют на экземпляре (или, скорее, экземпляре __dict__), если вы не назначили его вручную.

Например, если вы используете self.bar += 1 в методе, вы будете читать 1 из переменной уровня класса и назначьте 2 переменной уровня экземпляра. В следующий раз, когда вы запустите этот оператор, bar существует на уровне экземпляра, поэтому вы читаете, что 2 и замените его на 3.


Переменные состояния будут назначены перед конструктором (init). Так что...

Class Foo:
 bar = 1
 def __init__(self):
 bartwo = 2

будет видеть, что bar принимает значение 1, прежде чем назначить bartwo. Я предполагаю, что ваш вопрос: "Если я назначу переменную состояния перед конструктором, могу ли я использовать ее в конструкторе. Да.

licensed under cc by-sa 3.0 with attribution.