Wie verwenden Sie ein Klassenattribut für einen Klasseninstanz-Methodenentwerfer?

8

Ich habe einige Klassen, die ungefähr so ​​aussehen:

%Vor%

Ich habe keine Kontrolle über den @baz Dekorator und muss das Klassenattribut bar der neuen Klasse Rab verwenden. Der Aufruf von Rab.oof() verwendet jedoch bar=None der Basisklasse.

    
Dan P. 25.06.2014, 19:13
quelle

3 Antworten

5

Hier ist also eine Art seltsamer / interessanter Ansatz, bei dem Sie nur Foo ändern müssen. Die Idee ist, dass ein neuer Decorator erstellt wird, der die baz Dekoration verzögert, bis die Funktion zum ersten Mal mit Caching aufgerufen wird auf den Klassennamen, so dass es nur einmal passiert.

Beachten Sie, dass dies auch eine Dummy-Implementierung für baz enthält, die nur das angegebene Argument frob ausgibt, aber dieser Ansatz sollte gut funktionieren, ohne dass baz :

geändert werden muss %Vor%

Ich musste auch ein self Argument zu oof hinzufügen, basierend auf der Annahme, dass oof eine Methode ist, wenn baz auch die Funktion in eine statische Methode umwandelt. Ich bin mir nicht sicher, ob dieser Ansatz funktioniert .

    
Andrew Clark 25.06.2014 19:44
quelle
3

Sie konnten den Abschluss aus Foo auspacken und die umbrochene Funktion herausziehen und dann im Dekorator der abgeleiteten Klasse erneut umbrechen. Aber wenn es irgendeinen Weg gibt, wie Sie Foo oder sogar baz erreichen können, wäre es besser.

%Vor%     
Silas Ray 25.06.2014 19:27
quelle
2

Sie können die undekorierte Version von oof beibehalten, nennen wir sie _oof_raw und wickeln Sie sie erneut in Ihre Unterklassendefinition ein. Um die undekorierte Version beizubehalten, müssen Sie "manuell" dekorieren, d. H. Den% syntaktischen Zucker @ nicht verwenden.

%Vor%     
shx2 25.06.2014 19:33
quelle

Tags und Links