1) Dlaczego jest self
wymagany jako wyraźny parametr w podpisach metod?
Ponieważ metody są funkcjami i foo.bar(baz)
są po prostu cukrem syntaktycznym bar(foo, baz)
. Klasy to tylko słowniki, w których niektóre wartości są funkcjami. (Konstruktory to również tylko funkcje, dlatego Python nie potrzebuje new
). Można powiedzieć, że Python wyraźnie mówi, że obiekty są zbudowane z prostszych komponentów. Jest to zgodne z filozofią „jawne jest lepsze niż niejawne”.
Natomiast w Javie obiekty są naprawdę magiczne i nie można ich sprowadzić do prostszych elementów w języku. W Javie (przynajmniej do Java 8) funkcja jest zawsze metodą będącą własnością obiektu, a tej własności nie można zmienić z powodu statycznej natury języka. Dlatego nie ma dwuznaczności w this
odniesieniu do tego, co się odnosi, więc sensowne jest, aby to domyślnie zdefiniować.
JavaScript jest przykładem języka, który ma niejawny charakter, this
taki jak Java, ale gdzie funkcje mogą istnieć niezależnie od obiektów takich jak Python. Prowadzi to do wielu nieporozumień dotyczących tego, co this
odnosi się, gdy funkcje są przekazywane i wywoływane w różnych kontekstach. Wielu instynktownie uważa, że this
musi odnosić się do pewnych wewnętrznych właściwości funkcji, podczas gdy jest ona w rzeczywistości określana wyłącznie przez sposób jej wywoływania. Wierzę, że posiadanie this
tak wyraźnego parametru jak w Pythonie sprawiłoby, że byłoby to mniej skomplikowane.
Kilka innych korzyści z jawnego self
parametru:
Dekoratory to tylko funkcje, które obejmują inne funkcje. Ponieważ metody są tylko funkcjami, dekoratorzy działają równie dobrze na metodach. Gdyby istniało jakieś ukryte ja, dekoratorzy nie pracowaliby transparentnie nad metodami.
Metody klas i metody statyczne nie przyjmują parametru instancji. Metody klas przyjmują klasę jako pierwszy argument (zwykle nazywany cls
). Wyraźne self
lub cls
parametry znacznie wyjaśniają, co się dzieje i do czego masz dostęp w metodzie.
2) Dlaczego zmienne instancji muszą zawsze być kwalifikowane za pomocą „ self.
?
W Javie nie trzeba poprzedzać zmiennych członkowskich znakiem „ this.
”, ale w Pythonie „ self.
” jest zawsze wymagane. Powodem jest to, że Python nie ma jawnej składni do deklarowania zmiennych, więc nie byłoby sposobu, aby stwierdzić, czy x = 7
należy zadeklarować nową zmienną lokalną lub przypisać do zmiennej członka. Określenie self.
rozwiązuje tę dwuznaczność.