Python: Festlegen der Metaklasse für alle Dateien in einem Ordner

8

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?

    
amustafa 23.04.2013, 20:24
quelle

2 Antworten

6

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:

%Vor%

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:

%Vor%

um die Auswirkungen zu begrenzen.

    
Martijn Pieters 23.04.2013, 20:27
quelle
1

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%     
Nizam Mohamed 09.03.2016 17:31
quelle