Explicit is better than implicit.
Naprawdę? W Pythonie nie ma różnicy między zmianą, a tworzeniem zmiennej. Obojętnie czy lokalnej czy pola w obiekcie. Niejawność na każdym kroku.
Przejrzałem parę artykułów. Jeden od GvM: http://neopythonic.blogspot.com/2008/10/why-explicit-self-has-to-stay.html Napisał tam, że jawny self umożliwia taką konstrukcję:
Kopiuj
# Define an empty class:
class C:
pass
# Define a global function:
def meth(myself, arg):
myself.val = arg
return myself.val
# Poke the method into the class:
C.meth = meth
To jakiś poważny monkey-patching.
Drugi argument to że niejawny self oznacza problem przy stosowaniu dekoratorów. To wskazuje na ułomność języka. C++, Java, C# itd rozróżniają między metodą statyczną a niestatyczną poprzez słowo kluczowe static i nie ma problemu.
W tym artykule https://docs.python.org/3/faq/design.html#why-must-self-be-used-explicitly-in-method-definitions-and-calls jest też argument, że bez jawnego selfa nie wiadomo czy mamy do czynienia ze zmiennymi lokalnymi czy polami instancji. Ruby radzi sobie z tym poprzez użycie @ przez nazwami składowych instancji. Niby dalej jawnie rozróżnia, ale @ jest znacznie krótsze niż self.. GvM jednak tego nie lubi i nie skorzysta z tego http://python-history.blogspot.com/2009/02/adding-support-for-user-defined-classes.html :
Another possible solution would have been to make instance variables lexically distinct. For example, having instance variables start with a special character such as @ (an approach taken by Ruby) or by having some kind of special naming convention involving prefixes or capitalization. Neither of these appealed to me (and they still don't).
W tym artykule o historii Pythona GvM jawnie przyznaje się do tego, że po prostu chciał mieć prosty interpreter i tak tworzył język by się jak najmniej narobić. To był jeden z głównych priorytetów. Drugi to, jak już wspomniałem, własne widzimisię. Gdyby GvM się chciało to zredukowałby ilość jawnych selfów do poziomu np takiego jaki jest w Ruby.