2017-07-04 7 views
0

Ich versuche herauszufinden, wie bekomme ich ein System, das ich für einen Theme-Manager für UI-Projekt arbeite ich arbeite um richtig zu arbeiten.Python super() und geerbt Klassenverzeichnis Speicherort

Beispiel:

Dateistruktur:

element.py - class Element() 
button.py  - class Button(Element) 
text.py  - class Text(Element) 
input/text.py - class Text(Element) 

ich Klassennamen für verschiedene Objekte in meinem Thema. (Ähnlich wie CSS)

So könnte "Element" die Textfarbe weiß haben.

Im Moment habe ich alle UI-Elemente aus 'Element' erben und mit:

self.__class__.__name__.lower() 

Dies wird für 'Button' arbeiten und 'Element', das Problem ins Spiel kommt für input.text vs Text. Text ist für alle Anwendungen der Anzeige von Text, so dass es in fast allen Elementen ist, aber die input.text-Klasse hat den Namen Text und wird für die Texteingabe verwendet und ich möchte einen Eigenschaftsselektor wie 'input.text' anstelle von 'text' verwenden "Das bekomme ich jetzt mit dem class.name.

Ich versuche, dies am Ende einzurichten, so dass es ein Plugin-System für andere Elemente hinzufügen und die Verzeichnisstruktur als Teil der Eigenschaftenselektor verwenden kann.

Zum Beispiel:

Button class: button 
Text class: text 
Text Input class: text, but in the directory 'input' 

ich herauszufinden versuche, wie Python zu bekommen zu überprüfen, ob ‚Selbst‘ im Elemente aus einem Super (Call) in einem Verzeichnis unter den ‚element.py‘ ist . Dies würde den Verzeichnisnamen zum Klassennamen für die Eigenschaften hinzufügen, gegen die er überprüft wird.

End Ergebnis wäre:

element 
button 
text 
input.text 

TLDR: Ich muss wissen, wie zu überprüfen, ob eine vererbte Klasse in einem anderen Verzeichnis als die Basisklasse ist und was das Verzeichnis aufgerufen wird.

Vielen Dank für jede Hilfe bei der Ermittlung.

+0

Ich glaube nicht, was Sie zu tun versuchen, ist einfach zu implementieren oder eine gute Idee im Allgemeinen. Ich empfehle (in keiner bestimmten Reihenfolge) 1) Benenne die Klasse in input/text.py in 'InputText' um, 2) Bilde ausschließlich einen Klassennamen basierend auf dem Dateipfad und dem Namen (was sich nicht als gute Idee anfühlt, aber ist besser als die Verwendung des Klassennamens und des Dateipfads), oder 3) standardmäßig den Klassennamen, aber erlauben Sie Klassen, den Namen zu überschreiben, indem Sie irgendwo ein optionales Feld angeben. Bitte bearbeiten Sie Ihre Frage entsprechend, wenn Sie Hilfe bei einer dieser Fragen haben möchten. – supersam654

Antwort

0

In Ordnung, ich habe herausgefunden, wie man es so macht, wie ich es wollte. Beantworte einfach die Frage, während ich auch an den Kommentar von @ supersam654 denke.

konnte ich herausfinden, wie der Weg von einer geerbten Klasse erhalten mit:

import os, sys 

el = os.path.dirname(sys.modules[self.__class__.__module__].__file__).split('/') 
base = os.path.dirname(__file__).split('/') 
for i in base: 
    el.remove(i) 

Alles, was übrig bleibt in ‚el‘ werden einzelne Verzeichnisnamen, die ich verwenden können.