Na czacie odbyła się dyskusja związana z pytaniem (samo pytanie nie ma znaczenia dla tego pytania), które ujawniło, że mogę nie znać Pythona.
Moim zdaniem, mimo że terminologia różni się w zależności od języka, ogólnie możemy klasyfikować funkcje jako:
- [darmowe] funkcje
- metody statyczne / funkcje członka statycznego
- metody niestatyczne / niestatyczne funkcje składowe
Najwyraźniej w Pythonie istnieje inny rodzaj funkcji, która nie pasuje do powyższych kategorii, która jest metodą, ale „nie zna swojej klasy”.
Co to są „metody klas” i „metody instancji” w Pythonie?
python
terminology
Lekkość Wyścigi z Moniką
źródło
źródło
Odpowiedzi:
Krótka odpowiedź
Długa odpowiedź
Metody klasowe
Metoda klasa to taka, która należy do grupy jako całości. Nie wymaga instancji. Zamiast tego klasa zostanie automatycznie wysłana jako pierwszy argument. Metodę klasy deklaruje się za pomocą
@classmethod
dekoratora.Na przykład:
Metody instancji
Z drugiej strony metoda instancji wymaga instancji w celu jej wywołania i nie wymaga dekoratora. Jest to zdecydowanie najpopularniejszy rodzaj metody.
(uwaga: powyższe dotyczy python3; w python2 pojawi się nieco inny błąd)
Metody statyczne
Statyczna metoda jest podobna do metody klasy, ale nie dostanie obiekt klasy jako automatyczny parametru. Jest tworzony przy użyciu
@staticmethod
dekoratora.Linki do dokumentacji
Oto linki do odpowiedniej dokumentacji Python3:
Dokumentacja modelu danych mówi o różnicy między metodami klasowymi a metodami statycznymi:
Powiązane pytania
źródło
"^ def("
, a następnie policzyłem wszystkie wystąpienia@staticmethod
. Bardzo nienaukowy, ale prawdopodobnie był na boisku.„Metoda instancji” wykorzystuje informacje zawarte w instancji, aby dowiedzieć się, jaką wartość zwrócić (lub jaki efekt uboczny zrobić). Te są bardzo częste.
„Metoda klasy” wykorzystuje informacje o klasie (a nie instancji tej klasy), aby wpływać na to, co ona robi (są one zwykle używane do tworzenia nowych instancji jako alternatywnych konstruktorów, a zatem nie są niewiarygodnie powszechne).
„Metoda statyczna” nie wykorzystuje żadnych informacji o klasie lub instancji do obliczenia tego, co robi. Zwykle jest w klasie dla wygody. (Jako takie też nie są zbyt częste.)
Funkcja X
Pamiętasz klasę matematyczną: „y jest funkcją x
f(x)
,?” Zastosujmy to w kodzie:Z powyższego wynika, że ponieważ
x
może się zmienić,y
może ulec zmianie, gdyx
zmiany. To właśnie ma na myśli, gdy mówimy, że „y
jest funkcjąx
”Co będzie
y
kiedyz
będzie1
?2
?'FooBarBaz'
?y
nie jest funkcjąz
, więcz
może być czymkolwiek i nie wpływać na wynik funkcji, zakładając, że naszafunction
jest funkcją czystą. (Jeśli uzyskuje dostępz
jako zmienna globalna, to nie jest to czysta funkcja - właśnie to oznacza funkcjonalna czystość.)Pamiętaj o powyższym, czytając następujące opisy:
Metody instancji
Metoda wystąpienie jest funkcją jest funkcja o wystąpieniu . Funkcja przyjmuje instancję domyślnie jako argument, a instancja jest używana przez funkcję do określenia wyniku funkcji.
Wbudowanym przykładem metody instancji jest str. Niższy:
str.lower
jest wywoływany w wystąpieniu ciągu i wykorzystuje informacje zawarte w wystąpieniu, aby dowiedzieć się, który nowy ciąg zwrócić.Metody klasowe:
Pamiętaj, że w Pythonie wszystko jest przedmiotem. Oznacza to, że klasa jest obiektem i może być przekazana jako argument funkcji.
Metoda klasy jest funkcją, która jest funkcją z klasy . Akceptuje klasę jako argument.
Wbudowanym przykładem jest
dict.fromkeys
:Funkcja niejawnie zna swoją klasę, funkcja wykorzystuje klasę do wpływania na wynik funkcji i tworzy nową klasę z iterowalnego. OragedDict pokazuje to, używając tej samej metody:
Metoda class wykorzystuje informacje o klasie (a nie instancji tej klasy), aby wpłynąć na typ klasy, który ma zostać zwrócony.
Metody statyczne
Wspominasz o metodzie, która „nie zna swojej klasy” - jest to metoda statyczna w Pythonie. Jest on jedynie dołączony dla wygody do obiektu klasy. Opcjonalnie może to być osobna funkcja w innym module, ale jej sygnatura wywołania byłaby taka sama.
Metoda statyczna nie jest funkcją klasy ani obiektu.
Wbudowanym przykładem metody statycznej jest str.maketrans z Python 3.
Biorąc pod uwagę kilka argumentów, tworzy słownik, który nie jest funkcją jego klasy.
Jest to wygodne, ponieważ
str
jest zawsze dostępne w globalnej przestrzeni nazw, więc możesz łatwo używać go z funkcją translacji:W Pythonie 2 musisz uzyskać do niego dostęp z
string
modułu:Przykład
Utwórzmy instancję:
Teraz instancja może wywoływać wszystkie metody:
Ale klasa zwykle nie jest przeznaczona do wywoływania metody instancji, chociaż oczekuje się, że wywoła inne:
Trzeba jawnie przekazać instancję, aby wywołać metodę instancji:
źródło
MyClass(1,2,3)
ale zamiast tego jakMyClass.get_special(1,2,3)
), a metoda statyczna jest po prostu będąc normalną funkcją, która i tak mogłaby stać sama.„Metoda instancji” to metoda, która jako pierwszy parametr przekazuje obiekt instancji, który zgodnie z konwencją jest wywoływany
self
. To jest domyślne.„Metoda statyczna” to metoda bez
self
parametru początkowego . Jest to realizowane za pomocą dekoratora @staticmethod .„Metoda klasy” to metoda, w której parametrem początkowym nie jest obiekt instancji, ale obiekt klasy ( zobacz w tej części dokumentacji Pythona, czym jest „obiekt klasy”), który zgodnie z konwencją jest nazywany
cls
. Jest to realizowane za pomocą dekoratora @classmethod .Typowe użycie terminu „metoda statyczna” w C / C ++ / etc dotyczy zarówno metod „statycznych”, jak i „klasowych” Pythona, ponieważ w obu tych metodach nie ma odwołania do instancji. W C / C ++ / etc metody zwykle mają niejawny dostęp do wszystkich członków / metod klasy innych niż instancja, i prawdopodobnie dlatego to rozróżnienie istnieje tylko w językach takich jak Python / Ruby / etc.
źródło
Class::staticMethod()
i to wszystko (o ile nie zabrania się dzwonić do niego, ponieważstaticMethod()
jest prywatne lub coś w tym stylu).