No, è possibile specificare solo il metaclasse per classe o per modulo. Non puoi impostarlo per l'intero pacchetto.
In Python 3.1 e poi, è possibile intercettare il gancio builtins.__build_class__
e inserire un metaclasse programatically, vedi Overriding the default type() metaclass before Python runs.
In Python 2.7, è possibile sostituire __builtins__.object
con una sottoclasse che utilizza la metaclasse. Come il gancio builtins.__build_class__
, questo è hackery avanzato e infrange il codice tanto quanto ottenere il metacless in qualsiasi posto.
fare in modo, sostituendo il riferimento object
sul __builtin__
module:
import __builtin__
class MetaClass(type):
def __new__(mcls, name, *args):
# do something in the metaclass
return super(MetaClass, mcls).__new__(mcls, name, *args)
orig_object = __builtin__.orig_object
class metaobject(orig_object):
__metaclass__ = MetaClass
def enable():
# *replace* object with one that uses your metaclass
__builtin__.object = metaobject
def disable():
__builtin__.object = orig_object
Run enable()
questo prima di importare il vostro pacchetto e tutte le classi di nuovo stile (quelle che può sostenere un metaclasse) avrà il vostro metaclasse. Tieni presente che questo comportamento si propagherà a a tutti i codici Python non ancora caricati, inclusa la libreria standard, poiché il pacchetto importa il codice. Probabilmente vuoi usare:
enable()
import package
disable()
per limitare gli effetti.
fonte
2013-04-23 20:27:34
@slashdottir: ecco, risposta aggiornata per coprire 2.7. È ancora un altro hack. –