a
, b
и c
показывают разные области действия переменных.Это означает, что эти переменные имеют различную видимость и среду, в которой они действительны.
Сначала вам нужно понять разницу между классом и объектом.Класс - это средство описания некоторого общего поведения.Затем объект создается на основе этого класса.Объект «наследует» все методы класса и может определять переменные, которые связаны с объектом.Идея состоит в том, что объекты инкапсулируют некоторые данные и требуемое поведение для работы с этими данными.Это основное отличие от процедурного программирования, где модули определяют поведение, а не данные.
c
теперь является такой переменной экземпляра, что означает переменную, которая находится в области действия экземпляра MyClass
.self
всегда является ссылкой на текущий экземпляр объекта, под которым выполняется текущий код.Технически, __d
работает так же, как c
, и имеет ту же область видимости.Разница здесь в том, что в Python существует соглашение о том, что переменные и методы, начинающиеся с двух подчеркиваний, должны считаться закрытыми и не должны использоваться кодом вне класса.Это необходимо, потому что в Python нет способа точно определить приватные или защищенные методы и переменные, как это делают многие другие языки.
b
- это простоепеременная, которая действительна только внутри метода __init__
.Если выполнение выходит из метода __init__
, переменная b
будет собирать мусор и больше не будет доступна, в то время как c
и __d
все еще допустимы.Обратите внимание, что b
не предшествует self
.
Теперь a
определяется непосредственно в классе.Это делает его так называемой переменной класса.Как правило, он используется для хранения статических данных.Эта переменная одинакова для всех экземпляров класса MyClass
.
Обратите внимание, что это описание немного упрощено и опускает такие вещи, как метаклассы и различие между функциями и связанными методами, но вы понимаете, что ....