1) Dlaczego jest selfwymagany 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 thisodniesieniu 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, thistaki jak Java, ale gdzie funkcje mogą istnieć niezależnie od obiektów takich jak Python. Prowadzi to do wielu nieporozumień dotyczących tego, co thisodnosi się, gdy funkcje są przekazywane i wywoływane w różnych kontekstach. Wielu instynktownie uważa, że thismusi 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 thistak wyraźnego parametru jak w Pythonie sprawiłoby, że byłoby to mniej skomplikowane.
Kilka innych korzyści z jawnego selfparametru:
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 selflub clsparametry 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 = 7należy zadeklarować nową zmienną lokalną lub przypisać do zmiennej członka. Określenie self.rozwiązuje tę dwuznaczność.