Wann werden Definitionen von Metaklassen in Python eingebunden?
Heute bin ich auf eine überraschende Definition einer Metaklasse in Python gestoßenHie, wobei die Metaklassendefinition effektiv eingebettet ist. Der relevante Teil ist
class Plugin(object):
class __metaclass__(type):
def __init__(cls, name, bases, dict):
type.__init__(name, bases, dict)
registry.append((name, cls))
Wann macht es Sinn, eine solche Inline-Definition zu verwenden?
Weitere Argumente:
Ein Argument wäre, dass die erstellte Metaklasse mit dieser Technik an keiner anderen Stelle wiederverwendbar ist. Ein Gegenargument ist, dass ein gängiges Muster bei der Verwendung von Metaklassen darin besteht, eine Metaklasse zu definieren und in einer Klasse zu verwenden und dann von dieser abzubrechen. Zum Beispiel ina konservative Metaklasse die Definitio
class DeclarativeMeta(type):
def __new__(meta, class_name, bases, new_attrs):
cls = type.__new__(meta, class_name, bases, new_attrs)
cls.__classinit__.im_func(cls, new_attrs)
return cls
class Declarative(object):
__metaclass__ = DeclarativeMeta
def __classinit__(cls, new_attrs): pass
hätte geschrieben werden können als
class Declarative(object): #code not tested!
class __metaclass__(type):
def __new__(meta, class_name, bases, new_attrs):
cls = type.__new__(meta, class_name, bases, new_attrs)
cls.__classinit__.im_func(cls, new_attrs)
return cls
def __classinit__(cls, new_attrs): pass
Irgendwelche anderen Überlegungen?