2017-01-24 1 views
2

I-Code haben will, dass sie so etwas wie dieser MomentWie in einem Verfahren Zugang zu beiden cls und Selbst haben

class myClass(): 

    def __init__(self): 
     self.__var1 = 'var1' 

    var2 = 'var2' 

    def myNormalMethod(self): 
     print self.__var1 

    @classmethod 
    def myClassMethod(cls): 
     print cls.__var2 

    #How do I do this? 
    def myMethod(): 
     print self.__var1 
     print cls.__var2 

die letzte Methode nicht, da ich weiß nicht funktioniert, wie ich haben, kann den Zugang sowohl selbst als auch cls. Wie implementiere ich das?

+1

'myMethod()' sollte als 'myMethod (self)' deklariert werden, so dass es Zugriff auf 'self' als Parameter hat. (Wie 'myNormalMethod (self)', oben.) Sie können 'self's Klasse mit' type (self) 'erhalten. – khelwood

Antwort

3

Als sehr kurzen Überblick, self bezieht sich auf eine aktuelle Instanz der Klasse, während cls Variablen der Klasse gebunden sind itelf das heißt, unter jedem Fall geteilt. Hier sind einige Referenzen dabei zu helfen, und, wie ich zu Ihrer Lösung:

ich Ihr Beispielcode modifiziert, um den Unterschied zu veranschaulichen und enthalten eine Lösung:

class MyClass: 
    __var2 = 'var2' 
    var3 = 'var3' 

    def __init__(self): 
     self.__var1 = 'var1' 

    def normal_method(self): 
     print self.__var1 

    @classmethod 
    def class_method(cls): 
     print cls.__var2 

    def my_method(self): 
     print self.__var1 
     print self.__var2 
     print self.__class__.__var2 


if __name__ == '__main__': 
    print MyClass.__dict__['var3'] 

    clzz = MyClass() 
    clzz.my_method() 

__var2 und var3 sind in der Klasse gespeicherte Variablen. Sie können auf jede Klassenvariable ohne Instanz über __dict__ zugreifen, die den Namensraum darstellt.

Da Klassenvariablen Teil jeder Instanz werden, können Sie einfach self aufrufen, um auf sie zuzugreifen. Alternativ können Sie explizit self.__class__.__var2 aufrufen, um zu verdeutlichen, wo die beabsichtigte Variable tatsächlich gespeichert ist.

1

Sie könnten einfach self.__var2 tun - alle Attribute, die nicht auf der Instanz gefunden werden, werden automatisch in der Klasse nachgeschlagen.

Um explizit anzugeben, dass das Attribut von der Klasse selbst erwartet wird, verwenden Sie self.__class__.__var2.

Verwandte Themen