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:
Декоратори - це лише функції, які охоплюють інші функції. Оскільки методи - це лише функції, декоратори працюють так само добре, як і методи. Якби була якась неявна самостійна, декоратори не працювали б прозоро над методами.
Класметоди та статичні методи не приймають параметр екземпляра. Classmethods приймають клас як перший аргумент (як правило, його називають cls). Явні параметри selfчи clsпараметри значно зрозуміліші, що відбувається, і до чого у вас є доступ у методі.
2) Чому для змінних примірників завжди можна кваліфікувати " self.?
У Java вам не потрібно префіксувати змінні члена " this.", але в Python self.завжди потрібен "". Причина полягає в тому, що Python не має явного синтаксису для декларування змінних, тому не було б можливості сказати, чи x = 7слід оголошувати нову локальну змінну або призначити змінну члена. Вказання self.вирішує цю неоднозначність.