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?

Author: Chris, 2009-11-22

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).

 35
Author: Alex Martelli,
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