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.
вирішує цю неоднозначність.