Uczyłem się Pythona, postępując zgodnie z kilkoma samouczkami dotyczącymi pygame .
Tam znalazłem szerokie zastosowanie słowa kluczowego self , a ponieważ wywodzę się głównie z języka Java, stwierdzam, że ciągle zapominam o wpisaniu self . Na przykład zamiast self.rect.centerx
wpisywać rect.centerx
, ponieważ dla mnie rect jest już zmienną składową klasy.
Równoległość Java, o której mogę pomyśleć w tej sytuacji, polega na poprzedzeniu wszystkich odwołań do zmiennych składowych tym .
Czy utknąłem z przedrostkiem wszystkich zmiennych składowych self , czy jest sposób ich zadeklarowania, który pozwoliłby mi uniknąć konieczności robienia tego?
Nawet jeśli to, co sugeruję, nie jest pythonowe , nadal chciałbym wiedzieć, czy jest to możliwe.
Rzuciłem okiem na te powiązane pytania SO, ale nie do końca odpowiadają one, o co mi chodzi:
m_
prefiksu dla wszystkich nazw członków, którą przestrzegają niektórzy programiści C ++ / Java? Wself.
podobny sposób użycie ułatwia czytelność. Powinieneś także przeczytać dirtsimple.org/2004/12/python-is-not-java.html .m_
jest używany tylko dla niepublicznych niestatycznych składowych danych (przynajmniej w C ++).mVariableName
zmiennych składowych podczas kodowania w Javie. Myślę, że komentarz @ Anurag podsumowuje to całkiem dobrze, ponieważ programista Java powinien zrobić, ucząc się Pythona.Odpowiedzi:
Python wymaga określenia self. W rezultacie nigdy nie ma nieporozumień co do tego, co jest składnikiem, a co nie, nawet bez widocznej pełnej definicji klasy. Prowadzi to do przydatnych właściwości, takich jak: nie można dodawać elementów członkowskich, które przypadkowo przesłaniają elementy niebędące członkami i tym samym łamią kod.
Jeden skrajny przykład: możesz napisać klasę bez wiedzy o tym, jakie klasy bazowe może mieć, i zawsze wiedzieć, czy uzyskujesz dostęp do członka, czy nie:
To cały kod! (some_function zwraca typ używany jako podstawa).
Inny, w którym metody klasy są tworzone dynamicznie:
Pamiętaj, że oba te przykłady są ekstremalne i nie będziesz ich widzieć codziennie, ani nie sugeruję, abyś często pisał taki kod, ale jasno pokazują aspekty tego, jak ja sam jesteś wyraźnie wymagany.
źródło
self
.__shadow__ myFieldName
. Zapobiegałoby to również przypadkowemu cieniowaniu, prawda?Wszystkie poprzednie odpowiedzi są w zasadzie wariantami „nie możesz” lub „nie powinieneś”. Chociaż zgadzam się z tym drugim zdaniem, to pytanie technicznie nadal pozostaje bez odpowiedzi.
Ponadto istnieją uzasadnione powody, dla których ktoś mógłby chcieć zrobić coś podobnego do tego, o co chodzi w tym pytaniu. Czasami napotykam na długie równania matematyczne, w których używanie długich nazw sprawia, że równanie jest nierozpoznawalne. Oto kilka sposobów, jak możesz to zrobić na przykładzie puszki:
Trzeci przykład - tj. Używanie
for k in self.__dict__ : exec(k+'= self.'+k)
jest w zasadzie tym, o co właściwie chodzi w pytaniu, ale pozwól mi wyjaśnić, że nie uważam, że jest to ogólnie dobry pomysł.Aby uzyskać więcej informacji i sposobów iteracji po zmiennych klasowych, a nawet funkcjach, zobacz odpowiedzi i dyskusję na to pytanie . Omówienie innych sposobów dynamicznego nazywania zmiennych oraz powodów, dla których zwykle nie jest to dobry pomysł, można znaleźć w tym poście na blogu .
AKTUALIZACJA: Wydaje się, że nie ma możliwości dynamicznej aktualizacji lub zmiany ustawień lokalnych w funkcji w Pythonie3, więc calc3 i podobne warianty nie są już możliwe. Jedynym rozwiązaniem kompatybilnym z Python3, o którym mogę teraz pomyśleć, jest użycie
globals
:Co znowu byłoby straszną praktyką w ogóle.
źródło
locals
zamiast używaćexec
?locals().update(self.__dict__)
w Pythonie 2 i 3, ale to nie zadziałało. W pythonie3 nawet sztuczka „exec” nie wchodzi w grę. Z drugiej stronyglobals().update(self.__dict__)
działa, ale ogólnie byłaby to straszna praktyka.Właściwie
self
nie jest słowem kluczowym, to tylko nazwa tradycyjnie nadana pierwszemu parametrowi metod instancji w Pythonie. I tego pierwszego parametru nie można pominąć, ponieważ jest to jedyny mechanizm, jaki posiada metoda, aby wiedzieć, która instancja Twojej klasy jest wywoływana.źródło
Możesz na przykład użyć dowolnej nazwy
lub nawet
ale utkniesz z użyciem nazwy zakresu.
Nie polecam używania czegoś innego dla siebie, chyba że masz przekonujący powód, ponieważ byłoby to obce dla doświadczonych pytonistów.
źródło
self
i powinieneś postępować zgodnie z konwencją. Dzięki temu Twój kod będzie łatwiejszy do zrozumienia dla każdego doświadczonego programisty Pythona, który go obejrzy. (Obejmuje to ciebie, za sześć miesięcy, próbujesz dowiedzieć się, co robi twój stary program!)def function(_, variable): _.variable = variable
def funcion(*args): args[0].variable = args[1]
tak, musisz zawsze określać
self
, ponieważ wyraźne jest lepsze niż niejawne, zgodnie z filozofią Pythona.Dowiesz się również, że sposób, w jaki programujesz w Pythonie, bardzo różni się od sposobu, w jaki programujesz w Javie, stąd użycie
self
ma tendencję do zmniejszania się, ponieważ nie wyświetlasz wszystkiego wewnątrz obiektu. Zamiast tego w większym stopniu wykorzystujesz funkcję na poziomie modułu, którą można lepiej przetestować.tak poza tym. Na początku tego nienawidziłem, teraz nienawidzę czegoś odwrotnego. to samo dla sterowania przepływem sterowanym wcięciem.
źródło
self
w żaden sposób nie dotykają . Więc jaki jest sens posiadania ich na zajęciach?„Self” to konwencjonalny symbol zastępczy dla bieżącej instancji obiektu klasy. Jest używany, gdy chcesz odwołać się do właściwości, pola lub metody obiektu wewnątrz klasy, tak jakbyś odnosił się do „samego siebie”. Ale żeby to skrócić, ktoś w dziedzinie programowania w Pythonie zaczął używać "self", inne dziedziny używają "this", ale robią to jako słowo kluczowe, którego nie można zastąpić. Raczej użyłem „jego”, aby zwiększyć czytelność kodu. To jedna z dobrych rzeczy w Pythonie - masz swobodę wyboru własnego symbolu zastępczego dla instancji obiektu innego niż „self”. Przykład dla siebie:
Teraz zamieniamy „siebie” na „jego”:
który jest teraz bardziej czytelny?
źródło
s
(lub jakaś inna pojedyncza litera) zamiastits
s
ma to samo znaczenie: alias do instancji klasy. musiałbym sprawdzić, coits
oznacza w kontekście tak samoself jest częścią składni Pythona, która umożliwia dostęp do elementów obiektów, więc obawiam się, że utknąłeś z tym
źródło
Właściwie możesz skorzystać z przepisu „Ukryte ja” z prezentacji Armina Ronachera „5 lat złych pomysłów” (wygoogluj to).
To bardzo sprytny przepis, jak prawie wszystko od Armina Ronachera, ale nie sądzę, żeby ten pomysł był zbyt atrakcyjny. Myślę, że wolałbym jawne to w C # / Java.
Aktualizacja. Link do „przepisu na zły pomysł”: https://speakerdeck.com/mitsuhiko/5-years-of-bad-ideas?slide=58
źródło
def method(
<del> self </del>)
, aleself.variable
nadal jest wymagane w przypadku tego sprytnego hacka.Tak, jaźń jest nudna. Ale czy jest lepiej?
źródło
_
ma specjalne znaczenie w powłoce Pythona, gdzie przechowuje ostatnią zwróconą wartość. Używanie go w ten sposób jest bezpieczne, ale może być mylące; Unikałbym tego.s
Lubm
(aby naśladować C ++)Od: Self Hell - Więcej funkcji stanowych.
źródło
__str__
I tym podobne), ponieważ są one wywoływane w inny sposób niż zwykłe metody.Myślę, że byłoby łatwiej i bardziej czytelnie, gdyby istniało stwierdzenie „member”, tak jak jest „global”, dzięki czemu można powiedzieć tłumaczowi, które obiekty należą do klasy.
źródło