Teraz, gdy jest jasne, co to jest metaklasa , istnieje powiązana koncepcja, z której korzystam cały czas, nie wiedząc, co to naprawdę oznacza.
Przypuszczam, że wszyscy popełnili kiedyś błąd w nawiasie, co spowodowało wyjątek „obiekt nie jest wywoływalny”. Co więcej, używanie __init__
i __new__
prowadzi do zastanawiania się, do czego ten cholerny __call__
można wykorzystać.
Czy możesz podać mi wyjaśnienia, w tym przykłady z magiczną metodą?
Odpowiedzi:
Odwołanie to wszystko, co można nazwać.
Wbudowaną wymagalne (PyCallable_Check w objects.c) sprawdza, czy argument jest:
__call__
metodą lubNazwana metoda
__call__
to ( zgodnie z dokumentacją )Przykład
źródło
callable
w rzeczywistości mówi ci, czy coś można wywołać, czy nie, podczas gdy sprawdzanie__call__
, nic ci nie mówi; Jeśli obiekto
udostępnia__getattribute__
lub__getattr__
,hasattr(o, '__call__')
może powrócić prawda, aleo
nie będą jeszcze wymagalne, ponieważ pomija Python__getattribute__
i__getattr__
do rozmów. Jedynym realnym sposobem na sprawdzenie, czy coś jest na żądanie, jest więc EAFP.callable()
w Pythonie 3.x : „ Ta funkcja została najpierw usunięta w Pythonie 3.0, a następnie przywrócona w Pythonie 3.2. ”.tp_call
sprawdzana jest tylko obecność . Zobacz realizację PyCallable_Check , to 3 linie.Ze źródeł Python object.c :
To mówi:
__call__
atrybut.x
jest wywoływalny iffx->ob_type->tp_call != NULL
Opis
tp_call
pola :Zawsze możesz użyć wbudowanej
callable
funkcji, aby ustalić, czy dany obiekt można wywołać, czy nie; lub jeszcze lepiej po prostu zadzwoń i złapTypeError
później.callable
jest usunięty w Python 3.0 i 3.1, użyjcallable = lambda o: hasattr(o, '__call__')
lubisinstance(o, collections.Callable)
.Przykład, uproszczona implementacja pamięci podręcznej:
Stosowanie:
Przykład ze standardowej biblioteki, pliku
site.py
, definicji wbudowanejexit()
iquit()
funkcji:źródło
def f(): ...
, a klasa obiektów, takich jakclass C: ...
npf
,''.strip
,len
, iC
wszyscy są wymagalne. Wystąpienia, które mają__call__()
metodę w swojej klasie, są stosunkowo rzadkie.Callable to obiekt, który pozwala na użycie okrągłego nawiasu () i ostatecznie przekazanie niektórych parametrów, podobnie jak funkcji.
Za każdym razem, gdy definiujesz funkcję, python tworzy obiekt na żądanie. Na przykład możesz zdefiniować funkcję func na następujące sposoby (to samo):
Możesz użyć tej metody zamiast metod takich jak doit lub run , myślę, że po prostu wyraźniej jest zobaczyć obj () niż obj.doit ()
źródło
Pozwól mi wyjaśnić wstecz:
Rozważ to...
... jako cukier syntaktyczny dla:
Gdzie
foo
może być dowolny obiekt, który reaguje__call__
. Kiedy mówię dowolny obiekt, mam na myśli: typy wbudowane, własne klasy i ich instancje.W przypadku typów wbudowanych podczas pisania:
Zasadniczo wykonujesz:
Dlatego też nie masz
foo = new int
w Pythonie: po prostu sprawiasz, że obiekt klasy zwraca jego instancję__call__
. Sposób, w jaki Python rozwiązuje ten problem, jest moim zdaniem bardzo elegancki.źródło
type(int).__call__(int, '10')
itype(unicode).__call__(unicode, '10')
. Dundery są zawsze wywoływane w swojej klasie, a nie przez instancję. I nigdy też nie przechodzą przez metaklasę. W większości przypadków to tylko drobiazg, ale czasem ma to znaczenie.Callable to obiekt posiadający tę
__call__
metodę. Oznacza to, że możesz sfałszować wywoływane funkcje lub robić porządne rzeczy, takie jak Aplikacja Częściowa Funkcja, w której bierzesz funkcję i dodajesz coś, co ją ulepsza lub uzupełnia niektóre parametry, zwracając coś, co można wywołać z kolei (znane jako Currying w funkcjonalnych kręgach programowania ).Niektóre błędy typograficzne spowodują, że interpreter będzie próbował wywołać coś, czego nie zamierzałeś, na przykład (na przykład) ciąg znaków. Może to powodować błędy, gdy interpreter próbuje uruchomić aplikację, której nie można wywołać. Możesz zobaczyć, jak to się dzieje w interpreterie python, wykonując coś w rodzaju transkrypcji poniżej.
źródło
__call__
sprawia, że dowolny obiekt może być wywoływalny jako funkcja.Ten przykład wyświetli 8:
źródło
Po prostu „wywoływalny” to coś, co można nazwać metodą. Wbudowana funkcja „callable ()” powie ci, czy coś wydaje się być wywoływalne, podobnie jak sprawdzenie właściwości call . Funkcje są wywoływalne, podobnie jak klasy, instancje klas mogą być wywoływalne. Zobacz więcej na ten temat tutaj i tutaj .
źródło
W Pythonie wywoływalny jest obiekt, którego typ ma
__call__
metodę:Tak proste jak to :)
To oczywiście może być przeciążone:
źródło
Sprawdzanie funkcji lub metody klasy jest możliwe do wywołania, czy nie, oznacza to, że możemy wywołać tę funkcję.
źródło
callable(obj.__init___)
nie ma dodatkowego podkreślenia (jak w AttributeError)? Jeśli nie, czy jesteś pewien, że odpowiedź nie jest na to pytanieTrue
?Jest to coś, po czym możesz umieścić „(argumenty)” i oczekiwać, że zadziała. Wywołanie to zazwyczaj metoda lub klasa. Wywoływane są metody, tworzone są klasy.
źródło
callables implementuje
__call__
specjalną metodę, aby każdy obiekt z taką metodą był możliwy do wywołania.źródło
__call__
, nie będzie możliwa do wywołania, jeśli klasa nie zdefiniuje takiej metody.Callable to typ lub klasa „funkcji wbudowanej lub metody” z wywołaniem metody
Przykład: print to obiekt na żądanie. Za pomocą wbudowanej funkcji __call__ Po wywołaniu funkcji print Python tworzy obiekt typu print i wywołuje metodę __call__ przekazując parametry, jeśli takie istnieją.
Dziękuję Ci. Pozdrawiam, Maris
źródło
print
funkcję, Python tworzy obiekt typu print i wywołuje swoją metodę__call__
”. Python nie tworzy obiektu drukowania. To po prostu nazywa coś równoważnegotype(print).__call__(print, *args, **kwargs)
. A pierwsze zdanie nie ma większego sensu. Wygląda na to, że mylisz obiekt, który można wywołać, i „wywołuje” funkcję.