В отличие от скомпилированного языка, оператор class
в Python на самом деле является кодом, который выполняется и создает объект класса (а не экземпляр!) В памяти.
Любые символы, определенные при запуске блока class
, принадлежат самому классу. Это включает в себя переменные, такие как переменная eggs
в вашем первом примере, а также определенные вами методы __init__
и __str__
. Все они создаются, когда класс определен, и все они являются частью класса.
Переменные экземпляра не создаются до тех пор, пока вы фактически не создадите экземпляр объекта, и не будет запущен метод __init__
, и они имеют в качестве атрибутов self
.
Итак, когда интерпретатор python выполняет
class Spam(object):
eggs = {}
def __init__(self):
<stuff>
def __str__(self):
<other stuff>
это фактически создание объекта класса во время выполнения. Он выполняет код "eggs={}
", выполняет два оператора def
и создает класс с тремя атрибутами: eggs
, __init__
и __str__
.
.
Позже, когда он выполняется
spam1 = Spam()
Затем он создает новый экземпляр и запускает свой метод __init__
. Сам метод __init__
, конечно, принадлежит классу; он распределяется между всеми экземплярами, как атрибут eggs
.
Сам экземпляр передается как параметр self
, и все, что вы определяете для него, принадлежит только этому экземпляру. Вот почему self
должен быть передан в каждый метод класса - в python методы фактически принадлежат самому классу, и self
- единственный способ, которым вы должны ссылаться на экземпляр.