Metaklasy Pythona vs dekoratorzy klas
Jakie są główne różnice między metaklasami Pythona a dekoratorami klas? Czy jest coś, co mogę zrobić z jednym, ale nie z drugim?
1 answers
Dekoratory są znacznie, znacznie prostsze i bardziej ograniczone-i dlatego powinny być preferowane, gdy pożądany efekt można osiągnąć za pomocą metaklasy lub dekoratora klasy.
Cokolwiek możesz zrobić z dekoratorem klasy, możesz oczywiście zrobić z niestandardową metaklasą (po prostu zastosuj funkcjonalność "funkcji dekoratora", tzn. tę, która pobiera obiekt klasy i modyfikuje go, w trakcie metaklasy __new__
lub __init__
, które tworzą obiekt klasy!-).
Tam jest wiele rzeczy, które można zrobić w niestandardowej metaklasie, ale nie w dekoratorze (chyba że dekorator wewnętrznie generuje i stosuje niestandardową metaklasę, oczywiście-ale to oszustwo; -)... i nawet wtedy, w Pythonie 3, są rzeczy, które można zrobić tylko z niestandardową metaklasą, a nie po fakcie... ale to dość zaawansowana sub-nisza twojego pytania, więc podam prostsze przykłady).
Na przykład, załóżmy, że chcesz utworzyć obiekt klasy X
taki, że print X
(lub w Pythonie 3 print(X)
z oczywiście; -) wyświetla peekaboo!
. Nie możesz tego zrobić bez niestandardowej metaklasy, ponieważ nadrzędność metaklasy __str__
jest tutaj kluczowym czynnikiem, tzn. potrzebujesz def __str__(cls): return "peekaboo!"
w niestandardowej metaklasie klasy X
.
To samo dotyczy wszystkich metod magicznych, tzn. WSZYSTKICH rodzajów operacji stosowanych do samego obiektu klasy (w przeciwieństwie do tych stosowanych do jego instancji , które używają metod magicznych zdefiniowanych w klasie -- operacje na samym obiekcie klasy używają magii metody określone w metaklasie).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-22 17:49:49