Kiedy używasz 'self' w Pythonie?

Czy powinieneś używać self podczas odwoływania się do funkcji członka w Pythonie (w ramach tego samego modułu)?

Bardziej ogólnie, zastanawiałem się, kiedy jest wymagane użycie self, nie tylko dla metod, ale także dla zmiennych.

 34
Author: agf, 2011-10-11

4 answers

Dodanie odpowiedzi, ponieważ Oskarbi nie jest jednoznaczne.

Używasz self Kiedy:

  1. Definiowanie metody instancji. Jest on przekazywany automatycznie jako pierwszy parametr podczas wywoływania metody na instancji i jest to instancja, na której metoda została wywołana.
  2. odwoływanie się do klasy lub instancji atrybutu z wnętrza metody instancji. Użyj go, aby wywołać metodę lub uzyskać dostęp do nazwy (zmiennej) na instancji, na której została wywołana metoda, z wewnątrz tego metoda.

You don ' t use self when

  1. wywołujesz metodę instancji normalnie. Używając przykładu Oskarbi ' ego, jeśli robisz instance = MyClass(), to MyClass.my_method nazywasz instance.my_method(some_var), a nie instance.my_method(self, some_var).
  2. odwołujesz się do atrybutu klasy z poza metodą instancji, ale wewnątrz definicji klasy.
  3. jesteś wewnątrz staticmethod .

Te zakazy są tylko przykładami, kiedy nie używać jaźni. Dos jest wtedy, gdy powinien używać to.

 37
Author: agf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-11 06:51:51

Użyj self, aby odwoływać się do zmiennych i metod instancji z innych metod instancji. Umieść również self jako pierwszy parametr w definicji metod instancji.

Przykład:

class MyClass(object):

    my_var = None

    def my_method(self, my_var):
         self.my_var = my_var
         self.my_other_method()

    def my_other_method(self):
         # do something...
 16
Author: Oskarbi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-18 15:58:02
  1. Nie ma nic 'specjalnego' w nazwie self. Jest to nazwa preferowana przez Pythonistów, aby wskazać, co ten parametr ma zawierać.

  2. Środowisko uruchomieniowe Pythona przekaże wartość "self", gdy wywołasz metodę instancji na instancji, niezależnie od tego, czy świadomie ją podasz, czy nie. Zwykle spowoduje to łatwo zdiagnozowany / zrozumiały błąd (ponieważ funkcja zostanie wywołana z niewłaściwą liczbą parametrów), ale użycie *args może prowadzić do bardziej dziwnych błędów typu.

  3. Parametr jest przekazywany pośrednio, gdy wywołujesz metodę instancji na instancji. Zawiera instancję, na której wywołujesz metodę. Więc nie wspominasz self w wywołaniu funkcji, ponieważ (a) jak wspomniano powyżej, to nie miałoby sensu (nie ma self w zakresie, w ogóle, i self nie jest słowem kluczowym lub nazwą specjalną lub cokolwiek); (b) już wskazałeś instancję do użycia (pisząc my_instance.).

  4. Można oczywiście jawnie wywołać metodę instancji, uzyskując do niej dostęp z klasy. W takim przypadku należy jawnie przekazać instancję jako pierwszy parametr. Ogólnie rzecz biorąc, nie chcesz tego robić. A Ty szczególnie nie chcesz pisać kodu, który bierze pod uwagę możliwość, że pierwszy parametr jest czymś innym, co zostało jawnie przekazane w ten sposób. Jest to podobne do sprawdzania if (this == null) W C++: nie robisz tego, ponieważ jeśli może oznaczać cokolwiek, wtedy kod wywoławczy jest niewłaściwy, moralnie, jeśli nie prawnie. (Przynajmniej w Pythonie nie będziesz miał problemów z nieokreślonym zachowaniem, ale nadal jest to moralnie złe.)

  5. W metodzie instance, ponieważ self jest parametrem, któremu przypisano instancję jako wartość, można zapisać self.whatever, aby uzyskać dostęp do atrybutów instancji. W przeciwieństwie do innych języków stylu' implicit this', nazwy atrybutów to , A Nie implicite "in scope"

  6. Nie ma innych przypadków użycia dla self, ponieważ znowu nie jest to specjalna nazwa, a to jest jeden konkretny cel, który adresuje konwencja nazewnictwa. Jeśli potrzebujesz dostępu do 'zmiennej' (tak naprawdę atrybutu) z innego modułu, użyjesz nazwy modułu. Jeśli chcesz uzyskać dostęp do jednego z obecnych modułów, nie jest potrzebny prefiks, lub naprawdę jest to możliwe. (Cóż, możesz wyraźnie sprawdzić to w dict zwróconym przez globals(), ale proszę, nie rób tego.)

 4
Author: Karl Knechtel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-11 21:58:39

Na przykład zmienna i dla metod obowiązkowe jest użycie self w każdej chwili.

 3
Author: lc2817,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-11 06:04:01