2016-08-24 5 views
2

Gibt es in Python eine Möglichkeit, den Klassennamen im "statischen Konstruktor" zu erhalten? Ich möchte eine Klassenvariable mit einer geerbten Klassenmethode initialisieren.Statische Python-Vererbung in Klassenvariable

class A(): 
    @classmethod 
    def _getInit(cls): 
     return 'Hello ' + cls.__name__ 

class B(A): 
    staticField = B._getInit() 

NameError: name 'B' is not defined

Antwort

6

Der Name B nicht zugewiesen wird, bis die volle class Suite Objekt ausgeführt und eine Klasse erstellt wurde, wurde. Aus demselben Grund wird das __name__ Attribut für die Klasse nicht festgelegt, bis das Klassenobjekt erstellt wird.

Sie müssten das Attribut zuweisen danach:

class A(): 
    @classmethod 
    def _getInit(cls): 
     return 'Hello ' + cls.__name__ 

class B(A): 
    pass 

B.staticField = B._getInit() 

Die Alternative, eine Klasse Dekorateur zu verwenden ist (die die übergeben Objekt neu erstellte Klasse) oder eine Metaklasse verwenden (das Objekt der Klasse erstellt an erster Stelle und ist der Name zu verwenden).