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.решает эту двусмысленность.