Co to są metaklasy w Pythonie?
W Pythonie, czym są metaklasy i do czego ich używamy?
Nie znaleziono powiązanych wyników
Zaproszony:
Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się
Nie znaleziono powiązanych wyników
Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się
22 odpowiedzi
Anonimowy użytkownik
Potwierdzenie od:
Klasy jako obiekty
>
Zanim uporasz się z metaklasami, musisz wziąć udział w kursach mistrzowskich w Pythonie. Python ma bardzo osobliwą koncepcję tego, czym są klasy, zapożyczoną z Smalltalk.
W większości języków klasy to po prostu fragmenty kodu opisujące sposób tworzenia obiektu. Jest to również prawdą w Pythonie:
Ale klasy to coś więcej niż Python. Klasy też są obiektami.
Tak, przedmioty.
Po użyciu słowa kluczowego Python wykonuje je i tworzy
OBIEKT. Instrukcje
tworzy w pamięci obiekt o nazwie „ObjectCreator”.
Ten obiekt (klasa) sam jest w stanie tworzyć obiekty (instancje),
i dlatego jest to klasa
.
Ale nadal jest przedmiotem, a zatem:
Dynamiczne tworzenie zajęć
>
Ponieważ klasy są obiektami, możesz je tworzyć w locie, tak jak każdy inny obiekt.
Po pierwsze, możesz utworzyć klasę w funkcji za pomocą :
Ale to nie jest tak dynamiczne, ponieważ nadal musisz sam napisać całą klasę.
Ponieważ klasy są obiektami, muszą być przez coś generowane.
Używając słowa kluczowego , Python tworzy ten obiekt automatycznie. Ale jak
a większość rzeczy w Pythonie daje możliwość zrobienia tego ręcznie.
Pamiętasz funkcję ? Dobra, staroświecka funkcja, która informuje, które
rodzaj obiektu:
Dobrze,
w
http://docs.python.org/2/libra ... 3type ma zupełnie inne możliwości, może też tworzyć klasy w locie. może przyjmować opis klasy jako parametry
i zwróć klasę.
(Wiem, że to głupie, że ta sama funkcja może mieć dwa zupełnie różne zastosowania w zależności od parametrów, które do niej przekazujesz. Jest to problem z powodu odwrotności
kompatybilność w Pythonie)
działa tak:
Gdzie:
dlatego można go utworzyć ręcznie:
Zauważysz, że jako nazwy klasy używamy „MyShinyClass”
i jako zmienna do przechowywania odniesienia do klasy. Mogą być różne
ale nie ma powodu, aby to komplikować.
akceptuje słownik definiujący atrybuty klasy. Więc:
Można przetłumaczyć na:
I jest używany jak normalna klasa:
I oczywiście możesz po nim dziedziczyć, więc:
by:
Ostatecznie będziesz chciał dodać metody do swojej klasy. Po prostu zdefiniuj funkcję
z odpowiednim podpisem i przypisz go jako atrybut.
Możesz dodać jeszcze więcej metod po dynamicznym utworzeniu klasy, tak jak dodawanie metod do normalnie utworzonego obiektu klasy.
Widzisz, dokąd zmierzamy: w Pythonie klasy są obiektami i możesz dynamicznie tworzyć klasę w locie.
To właśnie robi Python, gdy używasz słowa kluczowego i robi to z metaklasą.
Co to są metaklasy (wreszcie)
>
Metaklasy to „rzeczy”, które tworzą klasy.
Definiujesz klasy, aby tworzyć obiekty, prawda?
Ale dowiedzieliśmy się, że klasy Pythona są obiektami.
Cóż, metaklasy są tym, co tworzy te obiekty. Są to klasy klas,
możesz je przedstawić w ten sposób:
Widzieliście, że pozwala zrobić coś takiego:
Dzieje się tak, ponieważ funkcja jest w rzeczywistości metaklasą. to
metaklasa, której Python używa do tworzenia wszystkich klas w tle.
Teraz zastanawiasz się, dlaczego do cholery jest napisane małymi literami, a nie ?
Cóż, myślę, że jest to kwestia spójności z , klasą, która tworzy
obiekty typu string, a klasa tworząca obiekty typu integer. to
po prostu klasa, która tworzy obiekty klas.
Możesz to sprawdzić, sprawdzając atrybut .
Wszystko, i mam na myśli wszystko, jest obiektem w Pythonie. Obejmuje to int,
łańcuchy, funkcje i klasy. Wszystkie są obiektami. I wszystkie
powstały z klasy:
Więc jaki jest dowolnej ?
Zatem metaklasa to po prostu coś, co tworzy obiekty klas.
Jeśli chcesz, możesz to nazwać „fabryką klas”.
to wbudowana metaklasa, której używa Python, ale oczywiście możesz stworzyć własną
własna metaklasa.
Atrybut http://docs.python.org/2/refer ... ass__
>
W Pythonie 2 można dodać atrybut podczas pisania klasy (zobacz następną sekcję dotyczącą składni Pythona 3):
Jeśli to zrobisz, Python użyje metaklasy do utworzenia klasy .
Ostrożnie, to trudne.
Najpierw piszesz , ale obiekt klasy nie został jeszcze utworzony
na myśli.
Python będzie szukał w definicji klasy. Jeśli go znajdzie,
użyje go do stworzenia klasy obiektu . Jeśli tak się nie stanie, użyje do utworzenia klasy.
Przeczytaj to kilka razy.
Kiedy to robisz:
Python wykonuje następujące czynności:
Czy istnieje atrybut na ?
Jeśli tak, utwórz w pamięci obiekt klasy (powiedziałem obiekt klasy, zostań ze mną tutaj) o nazwie , używając tego, co jest w .
Jeśli Python nie może znaleźć , będzie szukał na poziomie MODUŁU i spróbuje zrobić to samo (ale tylko dla klas, które niczego nie dziedziczą, w zasadzie starego stylu zajęcia).
Następnie, jeśli w ogóle nie może znaleźć żadnego , użyje własnej metaklasy (pierwszy element nadrzędny) (który może być domyślnym typem), aby utworzyć obiekt klasy.
Uważaj tutaj, aby atrybut nie był dziedziczony, a metaklasa rodzica ( ) będzie. Jeśli użył atrybutu , który utworzył z (a nie ), podklasy nie odziedziczą tego zachowania.
Teraz główne pytanie brzmi: co możesz umieścić w ?
Odpowiedź brzmi: coś, co może stworzyć klasę.
A co może utworzyć klasa? lub cokolwiek, co tworzy podklasy lub używa tego.
Metaklasy w Pythonie 3
>
Składnia ustawiania metaklasy została zmieniona w Pythonie 3:
oznacza to, że atrybut nie jest już używany na rzecz argumentu klucza na liście klas bazowych.
Jednak zachowanie metaklas pozostaje w
w większości to samo
https://www.python.org/dev/peps/pep-3115/
większość.
Jedną rzeczą dodaną do metaklas w Pythonie 3 jest to, że można również przekazywać atrybuty jako argumenty słów kluczowych do metaklasy, na przykład:
Przeczytaj poniższą sekcję o tym, jak obsługuje to Python.
Niestandardowe metaklasy
>
Głównym celem metaklasy jest automatyczna zmiana klasy
podczas tworzenia.
Zwykle robisz to dla interfejsów API, w których chcesz utworzyć pasujące klasy
aktualny kontekst.
Wyobraź sobie głupi przykład, kiedy zdecydujesz, że wszystkie klasy w Twoim module są
muszą mieć atrybuty zapisane wielkimi literami. Jest kilka sposobów
zrób to, ale jednym z nich jest ustawienie na poziomie modułu.
W ten sposób wszystkie klasy tego modułu zostaną utworzone przy użyciu tej metaklasy,
i musimy po prostu powiedzieć metaklasie, aby zamieniła wszystkie atrybuty na wielkie litery.
Na szczęście można wywołać dowolnie, nie musi to być
klasa formalna (wiem, że coś, co ma w nazwie słowo „klasa”, nie musi być
klasa, wymyśl to ... ale to przydatne).
Zaczniemy więc od prostego przykładu z użyciem funkcji.
Sprawdźmy:
Zróbmy teraz to samo, ale używając prawdziwej klasy dla metaklasy:
Przepiszmy powyższe, ale z krótszymi i bardziej realistycznymi nazwami zmiennych teraz, gdy wiemy, co one oznaczają:
Być może zauważyłeś dodatkowy argument . jest
nic specjalnego w tym: zawsze pobiera klasę, w której jest zdefiniowany jako pierwszy parametr. Tak jak masz dla zwykłych metod, które otrzymują instancję jako pierwszy parametr lub definicję klasy dla metod klasowych.
Ale to nie jest całkowicie poprawne. Dzwonimy bezpośrednio do i nie nadpisujemy ani nie wzywamy Rodzica . :
Możemy uczynić to jeszcze czystszym, używając , co ułatwia dziedziczenie (ponieważ tak, metaklasy mogą dziedziczyć po metaklasach, dziedzicząc po typie):
Aha, iw Pythonie 3, jeśli wykonasz to wywołanie za pomocą argumentów słów kluczowych, takich jak:
Przekłada się to na to w metaklasie, aby go użyć:
To wszystko. Właściwie nie ma nic więcej w metaklasach.
Przyczyną złożoności kodu używającego metaklas nie jest to
jeśli chodzi o metaklasy, dzieje się tak dlatego, że zwykle używasz metaklas do robienia perwersyjnych rzeczy
polegając na introspekcji, manipulowaniu dziedziczeniem, zmiennymi takimi jak itp.
Rzeczywiście, metaklasy są szczególnie przydatne w przypadku czarnej magii, co oznacza
i do złożonych rzeczy. Ale same w sobie są proste:
Dlaczego używasz klas metaklasy zamiast funkcji?
>
Skoro może akceptować każdy wywoływalny obiekt, dlaczego miałbyś używać klasy
ponieważ jest to oczywiście trudniejsze?
Istnieje kilka powodów:
Dlaczego potrzebujesz metaklasy?
>
A teraz główne pytanie. Dlaczego miałbyś używać jakiejś niezrozumiałej funkcji podatnej na błędy?
Cóż, zazwyczaj nie:
Metaklasy to głęboka magia
99% użytkowników nigdy nie powinno się tym martwić.
Jeśli zastanawiasz się, czy ich potrzebujesz,
ty nie (ludzie, którzy naprawdę
potrzebuję ich, wiedz z całą pewnością
potrzebują ich i nie potrzebują
wyjaśnienie dlaczego).
Guru języka Python Tim Peters
Głównym przypadkiem użycia metaklasy jest utworzenie interfejsu API. Django ORM jest tego typowym przykładem. To pozwala zdefiniować coś takiego:
Ale jeśli to zrobisz:
Nie zwróci obiektu . Zwróci , a nawet może pobrać go bezpośrednio z bazy danych.
Jest to możliwe, ponieważ definiuje i
używa magii, która przekształci zdefiniowaną właśnie za pomocą prostych instrukcji , w trudny punkt zaczepienia do pola bazy danych.
Django sprawia, że coś złożonego staje się łatwe, udostępniając prosty interfejs API
i używając metaklas, odtwarzając kod z tego API, aby wykonać prawdziwą pracę
za kulisami.
Ostatnie słowo
>
Po pierwsze, wiesz, że klasy to obiekty, których wystąpienia można utworzyć.
Cóż, właściwie klasy są same w sobie instancjami. O metaklasach.
W Pythonie wszystko jest obiektem i wszystkie są instancjami klas
lub wystąpienia metaklas.
Z wyjątkiem .
jest w rzeczywistości własną metaklasą. To nie jest to, co możesz
zostanie odtworzony w czystym Pythonie i jest wykonywany przez małą sztuczkę na poziomie implementacji .
Po drugie, metaklasy są trudne. Możesz nie chcieć ich używać do
bardzo proste zmiany klas. Możesz zmienić klasy za pomocą dwóch różnych metod:
W 99% przypadków, kiedy musisz zmienić klasę, lepiej z nich skorzystać.
Ale w 98% przypadków w ogóle nie potrzebujesz zmiany klasy.
Anonimowy użytkownik
Potwierdzenie od:
Podczas gdy w Pythonie możesz używać dowolnych wywoływalnych obiektów dla metaklas (jak pokazuje Jerub), najlepszym podejściem jest uczynienie z niej rzeczywistej klasy. to normalna metaklasa w Pythonie. jest klasą i jest własnym typem. Nie będziesz w stanie odtworzyć czegoś takiego jak wyłącznie w Pythonie, ale Python trochę oszukuje. Aby stworzyć własną metaklasę w Pythonie, naprawdę chcesz podklasę .
Metaklasa jest najczęściej używana jako fabryka klas. Kiedy tworzysz obiekt przez wywołanie klasy, Python tworzy nową klasę (kiedy wykonuje instrukcję „class”), wywołując metaklasę. Zatem w połączeniu ze zwykłymi metodami i , metaklasy umożliwiają wykonywanie „dodatkowych czynności” podczas tworzenia klasy, takich jak rejestrowanie nowej klasy w jakimś rejestrze lub zastąpienie klasy czymś innym.
Kiedy wykonywana jest instrukcja , Python najpierw wykonuje treść instrukcji jako normalny blok kodu. Wynikowa przestrzeń nazw (dict) zawiera atrybuty klasy, które mają zostać utworzone. Metaklasa jest definiowana przez sprawdzenie klas bazowych, które mają być klasy (dziedziczone metaklasy), atrybutu class-to-be (jeśli istnieje) lub zmienna globalna. Następnie wywoływana jest metaklasa z nazwą, podstawami i atrybutami klasy w celu jej utworzenia.
Jednak metaklasy faktycznie definiują
typ
class, a nie tylko fabryka, dzięki czemu możesz z nimi zrobić znacznie więcej. Na przykład możesz zdefiniować zwykłe metody w metaklasie. Te meta metody są podobne do metod klasowych, ponieważ można je wywołać w klasie bez instancji, ale nie lubią też metod klasowych, ponieważ nie można ich wywołać w instancji klasy. typ .__ podklasy __ () jest przykładem metody w metaklasie . Możesz także zdefiniować typowe „magiczne” metody, takie jak , i , aby zaimplementować lub zmienić zachowanie klasy.
Oto zagregowany przykład bitów i kawałków:
Anonimowy użytkownik
Potwierdzenie od:
Metaklasy to sekretny sos, który sprawia, że „klasa” działa. Domyślna metaklasa dla nowego obiektu stylu nosi nazwę „typ”.
<pre class="lang-none prettyprint-override">
Metaklasy przyjmują 3 argumenty. "
Nazwa
", "
fusy
"i"
dykt
"
Tu zaczyna się tajemnica. Zobacz, skąd wzięła się nazwa, podstawy i dyktando w tym przykładzie definicji klasy.
Zdefiniujmy metaklasę, która pokazuje, jak '
class:
'' tak to nazywa.
Teraz, dla przykładu, który naprawdę coś znaczy, spowoduje to automatycznie, że zmienne z listy „atrybutów” zostaną ustawione w klasie na Brak.
Zwróć uwagę, że magiczne zachowanie, które uzyskuje z metaklasą nie jest propagowane do podklasy .
Oto jeszcze bardziej konkretny przykład pokazujący, w jaki sposób można podklasować „typ”, aby utworzyć metaklasę, która wykonuje akcję podczas tworzenia klasy. To dość trudne:
Anonimowy użytkownik
Potwierdzenie od:
Każda podklasa otrzymuje następnie atrybut klasy , który rejestruje kolejność, w jakiej klasy zostały zdefiniowane.
Anonimowy użytkownik
Potwierdzenie od:
Na przykład, jeśli spojrzysz na
Django models
http://docs.djangoproject.com/ ... dels/
ich definicja wygląda trochę zagmatwana. Wygląda na to, że definiujesz tylko właściwości klasy:
Jednak obiekty Person są zapełniane w czasie wykonywania różnymi użytecznymi metodami. Widzieć
źródło
http://code.djangoproject.com/ ... se.py
dla niesamowitych metaklas.
Anonimowy użytkownik
Potwierdzenie od:
http://www.onlamp.com/pub/a/py ... .html
http://www.onlamp.com/pub/a/py ... .html
(archiwum dla
https://web.archive.org/web/20 ... .html
https://web.archive.org/web/20 ... .html
)
W skrócie: klasa to schemat tworzenia instancji, metaklasa to schemat tworzenia instancji klasy. Łatwo zauważyć, że w Pythonie klasy muszą być również obiektami pierwszej klasy, aby zapewnić takie zachowanie.
Nigdy sam tego nie napisałem, ale myślę, że jedno z najprzyjemniejszych zastosowań metaklas można zobaczyć w
struktura
http://www.djangoproject.com/
Django. Klasy modeli używają metaklasy, aby zapewnić deklaratywny styl pisania nowych modeli lub klas formularzy. Podczas gdy metaklasa tworzy klasę, wszyscy członkowie mogą dostosowywać samą klasę.
Pozostaje powiedzieć: jeśli nie wiesz, czym są metaklasy, są szanse, że tak jest
nie są potrzebne
równa 99%.
Anonimowy użytkownik
Potwierdzenie od:
Co to są metaklasy? Do czego ich używasz?
>TLDR: metaklasa tworzy i definiuje zachowanie klasy w taki sam sposób, w jaki klasa tworzy i definiuje zachowanie dla instancji.
Pseudo kod:
Wszystkie powyższe elementy powinny wyglądać znajomo. Skąd się bierze ? To jest instancja metaklasy (również pseudokod):
W prawdziwym kodzie możemy przekazać domyślną metaklasę, , cokolwiek potrzebujemy, aby utworzyć instancję klasy, i otrzymujemy klasę:
Mówiąc inaczej
>
Kiedy piszesz definicję klasy i Python ją wykonuje, używa metaklasy do utworzenia instancji obiektu tej klasy (która z kolei będzie używana do tworzenia instancji tej klasy).
Tak jak możemy użyć definicji klas do zmiany zachowania instancji obiektów niestandardowych, tak samo możemy użyć definicji klasy metaklasy do zmiany zachowania obiektu klasy.
Do czego można je wykorzystać? Z
dokumenty
https://docs.python.org/3/refe ... ample
:
Potencjalne zastosowania metaklas są nieograniczone. Niektóre pomysły, które zostały zbadane, obejmują rejestrowanie, walidację interfejsu, automatyczne delegowanie, automatyczne tworzenie właściwości, serwery proxy, struktury i automatyczne blokowanie/synchronizację zasobów.
Jednak użytkownikom ogólnie zaleca się unikanie używania metaklas, chyba że jest to absolutnie konieczne.
Używasz metaklasy za każdym razem, gdy tworzysz klasę:
>
Kiedy piszesz taką definicję klasy,
Tworzysz instancję obiektu klasy.
Działa to tak samo, jak wywołanie funkcji z odpowiednimi argumentami i przypisanie wyniku do zmiennej o tej nazwie:
Zwróć uwagę, że niektóre rzeczy są automatycznie dodawane do , czyli do przestrzeni nazw:
Metaclass
utworzony przez nas obiekt jest w obu przypadkach .
(Uwaga dotycząca zawartości klasy : istnieje, ponieważ klasy muszą wiedzieć, gdzie są zdefiniowane, a i istnieje, ponieważ nie definiujemy - jeśli tak
zdefiniuj ,
https://coderoad.ru/472000/
zaoszczędzimy trochę miejsca w instancjach, ponieważ możemy wyłączyć i , wykluczając je. Na przykład:
80, ale błądzę.)
Możemy rozszerzyć tak jak każdą inną definicję klasy:
>
Oto domyślne klasy :
Jedną z najbardziej wartościowych rzeczy, które możemy zrobić domyślnie podczas pisania obiektu Pythona, jest dostarczenie mu ładnego . Kiedy dzwonimy do , wiemy, że istnieje dobry test dla , który również wymaga testu równości - . Poniższa prosta implementacja i dla instancji klas naszej klasy typu dostarcza nam demo, które może poprawić działanie domyślnych klas :
Więc teraz, kiedy tworzymy obiekt z tą metaklasą, odzwierciedlone w linii poleceń zapewnia znacznie mniej brzydki widok niż domyślny:
Mając dobre zdefiniowane dla wystąpienia klasy, mamy większe możliwości debugowania naszego kodu. Jednak dalsza weryfikacja za pomocą jest mało prawdopodobna (ponieważ obliczenia funkcji byłyby raczej niemożliwe z ich domyślnego ).
Oczekiwane użycie: przestrzeń nazw >
Jeśli na przykład chcemy wiedzieć, w jakiej kolejności tworzone są metody klasy, jako przestrzeń nazw klasy możemy podać uporządkowany dykt. Zrobilibyśmy to za pomocą , który
zwraca przestrzeń nazw dict dla klasy, jeśli zaimplementowano ją w Pythonie 3
https://docs.python.org/3/refe ... space
:
I zastosowanie:
A teraz mamy zapis kolejności, w jakiej te metody (i inne atrybuty klas) zostały utworzone:
Należy pamiętać, że ten przykład został zaadaptowany z
dokumentacja
https://docs.python.org/3/refe ... ample
- tworzy coś nowego
wyliczenie w bibliotece standardowej
https://github.com/python/cpyt ... um.py
.
Dlatego utworzyliśmy wystąpienie metaklasy, tworząc klasę. Metaklasę możemy również traktować jak każdą inną klasę. Ma kolejność rozwiązywania metod:
I ma w przybliżeniu poprawne (którego nie możemy już oceniać, chyba że znajdziemy sposób na przedstawienie naszych funkcji):
Anonimowy użytkownik
Potwierdzenie od:
Aktualizacja Pythona 3
W metaklasie istnieją (w tej chwili) dwie kluczowe metody:
umożliwia zapewnienie niestandardowego mapowania (na przykład ), które będzie używane jako przestrzeń nazw podczas tworzenia klas. Musisz zwrócić instancję dowolnej wybranej przestrzeni nazw. Jeśli nie zaimplementujesz , używany jest normalny .
jest odpowiedzialny za faktyczne tworzenie/modyfikowanie końcowej klasy.
Nagie kości, dodatkowa metaklasa nic nie rób:
Prosty przykład:
Załóżmy, że chcesz, aby na Twoich atrybutach działał prosty kod weryfikacyjny - na przykład zawsze powinien to być lub . Bez metaklasy Twoja klasa wyglądałaby mniej więcej tak:
Jak widać, nazwę atrybutu należy powtórzyć dwukrotnie. Dzięki temu możliwe są literówki i irytujące błędy.
Prosta metaklasa może rozwiązać ten problem:
Tak wyglądałaby metaklasa (bez użycia , ponieważ nie jest potrzebna):
Przykładowe wykonanie:
produkuje:
Uwaga
: ten przykład jest dość prosty, można go również wykonać za pomocą dekoratora klas, ale najwyraźniej faktyczna metaklasa zrobiłaby o wiele więcej.
Klasa „ValidateType” w celach informacyjnych:
Anonimowy użytkownik
Potwierdzenie od:
Rola metody metaklasy podczas tworzenia wystąpienia klasy
>
Jeśli programujesz w Pythonie dłużej niż kilka miesięcy, w końcu natkniesz się na kod, który wygląda tak:
To drugie jest możliwe, gdy zaimplementujesz w klasie magiczną metodę .
Metoda jest wywoływana, gdy instancja klasy jest używana jako obiekt wywoływalny. Ale jak widzieliśmy z poprzednich odpowiedzi, sama klasa jest instancją metaklasy, więc kiedy używamy klasy jako wywoływalnej (tj. Kiedy tworzymy jej instancję), w rzeczywistości wywołujemy jej metodę metaklasy ' . W tym momencie większość programistów Pythona jest nieco zdezorientowanych, ponieważ powiedziano im, że tworząc instancję taką jak ta , wywołujesz jej metodę ... Niektórzy, którzy sięgają nieco głębiej, wiedzą, że przed znajduje się . Cóż, dzisiaj ujawnia się kolejna warstwa prawdy, przed jest metaklasa ' .
Spójrzmy na łączenie wywołań metod z punktu widzenia tworzenia instancji klasy.
Jest to metaklasa, która rejestruje dokładnie moment przed utworzeniem instancji i moment, w którym ma ją zwrócić.
To jest klasa, której używa ta metaklasa
Teraz stwórzmy instancję
Należy pamiętać, że powyższy kod właściwie nie robi nic poza rejestracją zadań. Każda metoda deleguje rzeczywistą pracę implementacji swojego rodzica, zachowując w ten sposób domyślne zachowanie. Ponieważ jest klasą nadrzędną ( to domyślna metaklasa nadrzędna) i biorąc pod uwagę powyższą kolejność kolejności danych wyjściowych, mamy teraz klucz co byłoby pseudo-implementacją typu :
Widzimy, że metoda metaklasy jest wywoływana jako pierwsza. Następnie deleguje instancję do metody klasy i inicjalizację do metody instancji. Jest to również ten, który ostatecznie zwraca instancję.
Z powyższego wynika, że metaklasa ma również możliwość zdecydowania, czy ostatecznie wywołanie ma zostać wykonane do czy < code> Class_1 .__ init __ () . Podczas wykonywania może w rzeczywistości zwrócić obiekt, który nie został dotknięty żadną z tych metod. Weźmy na przykład takie podejście do wzorca singleton:
Zobaczmy, co się stanie, gdy wiele razy spróbujesz utworzyć obiekt typu
Anonimowy użytkownik
Potwierdzenie od:
Tak jest w przypadku, gdy rozważałem metaklasę jako rozwiązanie mojego problemu:
Miałem naprawdę trudny problem, który prawdopodobnie mógłby zostać rozwiązany inaczej, ale ostatecznie rozwiązałem go za pomocą metaklasy. Ze względu na swoją złożoność jest to jeden z nielicznych modułów, które napisałem, gdzie komentarze w module przekraczają ilość napisanego kodu. Oto jest ...
Anonimowy użytkownik
Potwierdzenie od:
Wersja Tl; dr
>
Funkcja zwraca typ obiektu.
To jest klasy
metaklasa
.
Aby użyć metaklasy:
to osobna metaklasa. Klasa klasy to metaklasa; Treść klasy to argumenty przekazywane do metaklasy używanej do budowania klasy.
Tutaj
https://docs.python.org/3/refe ... asses
możesz przeczytać o tym, jak używać metaklas do dostosowywania sposobu budowania klas.
Anonimowy użytkownik
Potwierdzenie od:
Większość to podklasy . przyjmuje klasę jako pierwszy argument i uwidacznia obiekt klasy z szczegóły w następujący sposób:
Pamiętaj, że klasa nie została nigdy utworzona; prosta czynność tworzenia klasy wyzwoliła wykonanie .
Anonimowy użytkownik
Potwierdzenie od:
Domyślna metaklasa używana podczas definiowania klas jako:
meta-klasa służy do zastosowania jakiejś reguły do całego zestawu klas. Na przykład, załóżmy, że tworzysz ORM w celu uzyskania dostępu do bazy danych i chcesz, aby rekordy z każdej tabeli należały do klasy skojarzonej z tą tabelą (na podstawie pól, reguł biznesowych itp.), Możliwe użycie metaklasy jest przykład logiki puli połączeń, która jest wspólna dla wszystkich klas rekordów ze wszystkich tabel. Innym zastosowaniem jest logika do obsługi kluczy obcych, która obejmuje wiele klas rekordów.
definiując metaklasę, wprowadzasz typ podklasy i możesz zastąpić następujące magiczne metody, aby wstrzyknąć swoją logikę.
jeśli już, te dwa haczyki są najczęściej używane. Metaklasa jest potężna, a powyższa lista nie jest kompletną listą zastosowań metaklasy.
Anonimowy użytkownik
Potwierdzenie od:
na przykład możemy utworzyć klasę Hi za pomocą funkcji type () i nie musimy używać tej metody z klasą Hi (object):
Oprócz używania type () do dynamicznego tworzenia klas, możesz kontrolować zachowanie tworzenia klas i używać metaklasy.
Zgodnie z modelem obiektowym Pythona klasa jest obiektem, więc klasa musi być instancją innej określonej klasy.
Domyślnie klasa Pythona jest instancją klasy typu. Oznacza to, że typ jest metaklasą większości wbudowanych klas i metaklasą klas niestandardowych.
Magia działa, gdy przekazujemy kluczowe argumenty do metaklasy, mówi ona interpreterowi Pythona, aby utworzył CustomList za pośrednictwem ListMetaclass.
new
(), w tym miejscu możemy na przykład zmienić definicję klasy i dodać nową metodę, a następnie zwrócić poprawioną definicję.
Anonimowy użytkownik
Potwierdzenie od:
To da taki wynik:
I oczywiście możesz utworzyć własną , aby zdefiniować zachowanie dowolnej klasy utworzonej za pomocą Twojej klasy.
Aby to zrobić, klasa typu musi być domyślnie dziedziczona, ponieważ jest to główna klasa :
Wynik będzie taki:
Anonimowy użytkownik
Potwierdzenie od:
Termin metaklasa oznacza po prostu coś używanego do tworzenia klas. Innymi słowy, jest to klasa klasy. Metaklasa służy do tworzenia klasy w taki sam sposób, w jaki obiekt jest instancją klasy, a klasa jest instancją metaklasy. W Pythonie klasy są również uważane za obiekty.
Anonimowy użytkownik
Potwierdzenie od:
jest potężny, jest wiele rzeczy (np. magia małp), które możesz z nią zrobić, ale bądź ostrożny, tylko Ty możesz to wiedzieć.
Anonimowy użytkownik
Potwierdzenie od:
python docs
https://docs.python.org/3.6/re ... .html
.
Anonimowy użytkownik
Potwierdzenie od:
Aby utworzyć metaklasę, metody są zwykle nadpisywane
new
() i
init
().
Nowy
() można zastąpić, aby zmienić sposób tworzenia obiektów, kiedy
inicjalizacja
() można zastąpić, aby zmienić sposób inicjalizacji obiektu. Metaklasę można utworzyć na kilka sposobów. Jednym ze sposobów jest użycie funkcji type (). Funkcja type () wywołana z 3 parametrami tworzy metaklasę. Parametry są następujące: -
Innym sposobem tworzenia metaklasy jest użycie słowa kluczowego „metaklasa”. Zdefiniuj metaklasę jako prostą klasę. W parametrach odziedziczonej klasy podaj metaclass = metaclass_name
Metaclass może być szczególnie używany w następujących sytuacjach: -
Anonimowy użytkownik
Potwierdzenie od:
Doskonały
jakość obrazu:
Metaklasa to klasa, której instancje są klasami. Tak jak „zwykła” klasa definiuje zachowanie instancji klasy, metaklasa definiuje zachowanie klas i ich instancji.
Metaklasy nie są obsługiwane przez wszystkie języki programowania zorientowanego obiektowo. Języki programowania obsługujące metaklasy różnią się znacznie pod względem sposobu ich implementacji. Python je obsługuje.
Niektórzy programiści postrzegają metaklasy w Pythonie jako „rozwiązania oczekujące lub szukające problemu”.
Metaklasy mają wiele zastosowań.
Definicja metaklasy
:
wypisze zawartość swoich argumentów do
Nowy
metoda i zwraca wyniki typu.
nowe wyzwanie
:
W poniższym przykładzie użyjemy metaklasy „LittleMeta”:
Wynik
:
Anonimowy użytkownik
Potwierdzenie od:
Widzimy, że typ klasy to , a typ i to .
Jeśli klasa jest zdefiniowana i brakuje elementu , zostanie użyty domyślny typ . Jeśli określono i nie jest on wystąpieniem , jest używany bezpośrednio jako .
Metaklasy mogą być używane w szczególności do logowania, rejestrowania klas podczas tworzenia i profilowania. Wydają się być dość abstrakcyjnymi pojęciami i możesz się zastanawiać, czy w ogóle powinieneś ich używać.
Anonimowy użytkownik
Potwierdzenie od: