Choć powodem jest głównie historyczne, istnieją pewne osobliwości w Pythona len
które sprawiają, że korzystanie z funkcji zamiast metody odpowiedniej .
Niektóre operacje w Pythonie są implementowane jako metody, na przykład list.index
i dict.append
, podczas gdy inne są realizowane jako callables i magicznymi sposobami, na przykład str
i iter
i reversed
. Obie grupy różnią się na tyle, że różne podejście jest uzasadnione:
- Są powszechne.
str
, int
i przyjaciele są typami. 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__
jest niedostępny i obsługuje dodatkowe argumenty, które nie mieszczą się w wywołaniu metody. Z tego samego powodu zmieniono it.next()
na next(it)
w najnowszych wersjach Pythona - ma to więcej sensu.
- Niektóre z nich są bliskimi krewnymi operatorów. Istnieje składnia do wywoływania
__iter__
i __next__
- nazywa się to pętlą for
. W celu zachowania spójności funkcja jest lepsza. I poprawia to dla niektórych optymalizacji.
- Niektóre funkcje są po prostu zbyt podobna do reszty w jakiś sposób -
repr
działa jak str
robi. Posiadanie str(x)
kontra x.repr()
może być mylące.
- Niektóre z nich rzadko używają rzeczywistej metody implementacji, na przykład
isinstance
.
- Niektóre z nich są rzeczywistymi operatorami,
getattr(x, 'a')
to inny sposób robienia x.a
i getattr
ma wiele z wyżej wymienionych cech.
Ja osobiście nazywam pierwszą metodą grupową i drugą typu operatora. To nie jest bardzo dobre wyróżnienie, ale mam nadzieję, że jakoś to pomoże.
Po tym, len
nie pasuje dokładnie do drugiej grupy. Jest bliżej operacji w pierwszej, z tą różnicą, że jest bardziej powszechny niż prawie każdy z nich. Ale jedyne, co robi, to wywołanie __len__
i jest bardzo zbliżone do L.index
. Istnieją jednak pewne różnice. Na przykład: __len__
może zostać wywołany w celu implementacji innych funkcji, takich jak bool
, jeśli metoda nazywała się len
, można złamać bool(x)
z niestandardową metodą len
, która robi zupełnie inną rzecz.
Krótko mówiąc, masz zestaw bardzo typowych funkcji, które mogą zostać zaimplementowane przez klasy, za pośrednictwem specjalnej funkcji (która zwykle robi więcej niż implementacja, jak zrobiłby to operator), podczas budowy obiektu, i wszystkie mają wspólne cechy. Cała reszta to metoda. I len
jest nieco wyjątkiem od tej reguły.
myślę ogólny powód to) historyczny oraz b) coś takiego jak 'len()' lub 'odwrócone()' odnosi się do wielu typów obiektów , ale metoda taka jak 'append()' odnosi się tylko do sekwencji, itp. –