Chociaż przyczyna jest głównie historyczna, w Pythonie istnieją pewne osobliwości, len
które sprawiają, że użycie funkcji zamiast metody jest właściwe.
Niektóre operacje w Pythonie są zaimplementowane na przykład jako metody, list.index
a dict.append
podczas gdy inne są zaimplementowane jako wywołania i metody magiczne, na przykład str
i iter
i reversed
. Te dwie grupy różnią się wystarczająco, więc inne podejście jest uzasadnione:
- Są pospolite.
str
, int
I przyjaciele są typy. Bardziej sensowne jest wywołanie konstruktora.
- Implementacja różni się od wywołania funkcji. Na przykład
iter
może wywołać, __getitem__
jeśli __iter__
nie jest dostępny, i obsługuje dodatkowe argumenty, które nie pasują do wywołania metody. Z tego samego powodu it.next()
został zmieniony next(it)
w ostatnich wersjach Pythona - ma to większy sens.
- Niektórzy z nich są bliskimi krewnymi operatorów. Istnieje składnia do wywoływania
__iter__
i __next__
- to się nazywa for
pętla. Dla spójności funkcja jest lepsza. I to sprawia, że jest to lepsze dla niektórych optymalizacji.
- Niektóre funkcje są po prostu w pewien sposób zbyt podobne do innych -
repr
działa jak str
działa. Mając str(x)
kontra x.repr()
byłoby mylące.
- Na przykład niektóre z nich rzadko korzystają z rzeczywistej metody implementacji
isinstance
.
- Niektórzy z nich są faktycznymi operatorami,
getattr(x, 'a')
to inny sposób działania x.a
i getattr
mają wiele z wyżej wymienionych cech.
Osobiście nazywam pierwszą grupę metodą metodyczną, a drugą grupę operacyjną. To niezbyt dobre rozróżnienie, ale mam nadzieję, że jakoś pomoże.
Powiedziawszy to, len
nie pasuje dokładnie do drugiej grupy. Jest bardziej zbliżony do operacji z pierwszej, z tą różnicą, że jest o wiele bardziej powszechny niż prawie każda z nich. Ale jedyne, co robi, to dzwonienie __len__
i jest bardzo blisko L.index
. Istnieją jednak pewne różnice. Na przykład __len__
może zostać wywołany w celu implementacji innych funkcji, na przykład bool
, jeśli metoda została wywołana, len
możesz zerwać bool(x)
z len
metodą niestandardową , która robi zupełnie inne rzeczy.
Krótko mówiąc, masz zestaw bardzo typowych funkcji, które mogą implementować klasy, a do których można uzyskać dostęp za pośrednictwem operatora, poprzez specjalną funkcję (która zwykle robi więcej niż implementacja, jak zrobiłby to operator), podczas konstruowania obiektu i wszystkie z nich mają wspólne cechy. Cała reszta to metoda. I len
jest pewnym wyjątkiem od tej reguły.
len()
lubreversed()
stosuje się do wielu typów obiektów, ale metoda takaappend()
ma zastosowanie tylko do sekwencji itp.