2017-11-26 5 views
0

Ich möchte die Klassenmethode addInstances innerhalb von __init__ aufrufen, ohne den Klassennamen Foo zu wiederholen.Rufen Sie eine Klassenmethode aus __init__, ohne den Klassennamen zu wiederholen

class Foo(): 
    myInstances = {} 

    @classmethod 
    def addInstance(cls, name, obj): 
     cls.myInstances[name]=obj 

    def __init__(self, name): 
     Foo.addInstance(name, self) # class name "Foo" is repeated 

#use the class 
if __name__ == "__main__": 
    Foo('testName') 
    print(Foo.myInstances) 

Der Code oben tut, was ich erwarte es zu tun. Jedoch wird "Foo" wiederholt.

Ersetzen der Linie

Foo.addInstance(name, self) # class name "Foo" is repeated 

mit

cls.addInstance(name, self) 

führt zu NameError: name 'cls' is not defined.

+0

Sie können auch anrufen 'self.addInstances (..)' – Vinny

Antwort

1

Solange Sie nicht addInstance außer Kraft setzen als einfache Methode

self.addInstance 

wird auch funktionieren.

Beide cls und Selbst sind Konventionen - im Gegensatz zu C++ diese, der Standard ist.

Deshalb sollten Sie sie ausdrücklich passieren müssen - zu Class und Methoden bzw.

Sie können auch

self.__class__.addInstance 
+0

Beachten Sie, dass 'schreiben self .__ class __. addInstance 'unterscheidet sich geringfügig von' self.addInstance', da erstere es nicht erlaubt, eine in einer Unterklasse überschriebene Methode aufzurufen. Verwenden Sie das Formular, das das tut, was Sie möchten. Das Problem hier ist nicht wirklich eine Konvention, sondern, wenn kein * instance * -Attribut mit dem Namen 'addInstance' existiert, versucht Python als nächstes, Klassenattribute mit diesem Namen unter Verwendung des MRO zu finden. – chepner

+0

@chepner, ich denke, es ist offensichtlich. Nur um OP zu helfen, das Schuldgefühl zu überwinden, wenn man die Klassenmethode durch _self_ benutzt :-) – volcano

Verwandte Themen