Ich habe eine Metaklasse geschrieben, die ich für Protokollierungszwecke in meinem Python-Projekt verwende. Es macht jede Klasse automatisch alle Aktivitäten protokollieren. Das einzige Problem ist, dass ich nicht in jede Datei gehen und hinzufügen möchte:
%Vor%Gibt es eine Möglichkeit, die Metaklasse im Ordner der obersten Ebene festzulegen, sodass alle darunter liegenden Dateien diese Metaklasse verwenden?
Nein, Sie können nur die Metaklasse pro Klasse oder pro Modul angeben. Sie können es nicht für das gesamte Paket festlegen.
In Python 3.1 und höher können Sie den Hook builtins.__build_class__
abfangen und eine Metaklasse programmatisch einfügen, siehe Überschreibt die Standard-Metaklasse type (), bevor Python ausgeführt wird .
In Python 2.7 können Sie __builtins__.object
durch eine Unterklasse ersetzen, die Ihre Metaklasse verwendet. Wie der builtins.__build_class__
-Hook ist dies Advanced Hackery und bricht deinen Code so sehr, wie du deine Metaklasse überall hin bekommst.
Tun Sie dies, indem Sie die object
-Referenz im Modul __builtin__
ersetzen:
Führen Sie enable()
this aus, bevor Sie Ihr Paket importieren, und alle Klassen im neuen Stil (die können eine Metaklasse unterstützen) haben Ihre Metaklasse. Beachten Sie, dass dieses Verhalten jetzt auf all Python-Code angewendet wird, der nicht bereits geladen ist, einschließlich der Standardbibliothek, da Ihr Paket Code importiert. Sie möchten wahrscheinlich Folgendes verwenden:
um die Auswirkungen zu begrenzen.
Hier ist eine einfache Technik. Nur Unterklasse die Klasse selbst mit __metaclass__
Attribut in der Unterklasse. Dieser Prozess kann automatisiert werden.
util.py
%Vor%main.py
%Vor%Test;
%Vor%Tags und Links python package environment-variables metaclass project