Staram się pisać rodzajowe metaklasa do śledzenia podklasyGeneric Python metaklasa śledzić podklasy
ponieważ chcę to mieć charakter ogólny, nie chciałam hardcode dowolną nazwę klasy w tym metaklasą, dlatego wpadłem funkcji, która generuje właściwą metaklasa, coś jak:
def make_subtracker(root):
class SubclassTracker(type):
def __init__(cls, name, bases, dct):
print('registering %s' % (name,))
root._registry.append(cls)
super(SubclassTracker, cls).__init__(name, bases, dct)
return SubclassTracker
ten sposób mogę powołać go do generowania metaklasa dla konkretnego korzeń klasie:
__metaclass__ = make_subtracker(Root)
Oto, gdzie wpadam na problem. Nie mogę tego zrobić:
class Root(object):
_registry = []
__metaclass__ = make_subtracker(Root)
... bo Root
nie została jeszcze określona, gdy używam make_subtracker(Root)
. Próbowałem dodanie metaklasa atrybut później, tak, że przynajmniej można go stosować w podklasach:
class Root(object):
_registry = []
Root.__metaclass__ = make_subtracker(Root)
... ale to nie działa. metaklasa ma specjalną obróbkę, gdy definicja klasy jest czytać, jak określono w http://docs.python.org/reference/datamodel.html#customizing-class-creation
szukam sugestii w tym celu (albo zmienić klasę metaklasa w czasie wykonywania w sposób, który jest stosowany do jego podklas lub jakąkolwiek inną alternatywę).
Nie rób tego. Ludzie, którzy przyjdą po ciebie, rozwiążą to, ponieważ jest to zbyt skomplikowane. Użyj funkcji fabrycznej, która tworzy obiekty odpowiedniej podklasy. –