1) Почему self
требуется в качестве явного параметра в сигнатурах метода?
Потому что методы являются функциями и foo.bar(baz)
просто синтаксическим сахаром для bar(foo, baz)
. Классы - это просто словари, в которых некоторые значения являются функциями. (Конструкторы также являются просто функциями, поэтому Python не нужен new
). Вы можете сказать, что Python явно указывает, что объекты создаются из более простых компонентов. Это в соответствии с «явным лучше, чем неявным» -философия.
Напротив, в Java объекты действительно волшебны и не могут быть сведены к более простым компонентам в языке. В Java (по крайней мере, до Java 8) функция всегда является методом, принадлежащим объекту, и это владение не может быть изменено из-за статической природы языка. Поэтому нет никакой двусмысленности в отношении того, что this
относится к этому, поэтому имеет смысл определить его неявным образом.
JavaScript - это пример языка, который неявно this
похож на Java, но где функции могут существовать отдельно от объектов, как в Python. Это приводит к большим путаницы о том , что this
относится к , когда функции передаются вокруг и называются в различных контекстах. Многие инстинктивно думают, что this
должны ссылаться на некоторое внутреннее свойство функции, в то время как оно на самом деле чисто определяется способом вызова функции. Я считаю, что наличие this
в качестве явного параметра, такого как в Python, сделает это намного менее запутанным.
Некоторые другие преимущества явного self
-параметра:
Декораторы - это просто функции, которые обертывают другие функции. Поскольку методы - это просто функции, декораторы так же хорошо работают с методами. Если бы было какое-то неявное «я», декораторы не работали бы прозрачно с методами.
Методы класса и статические методы не принимают параметр экземпляра. Методы класса принимают класс в качестве первого аргумента (как правило, называется cls
). Явные self
или cls
параметры делают намного более понятным, что происходит и к чему у вас есть доступ в методе.
2) Почему переменные экземпляров всегда должны быть квалифицированы как " self.
?
В Java вам не нужно ставить переменные-члены перед " this.
", но в Python " self.
" всегда требуется. Причина в том, что Python не имеет явного синтаксиса для объявления переменных, поэтому нет никакого способа узнать, x = 7
предполагается ли объявить новую локальную переменную или назначить переменную-член. Указание self.
решает эту двусмысленность.