2016-11-30 6 views
2

Ich habe eine Klasse, in der ich die Daten validieren möchte, wenn die Eigenschaft geändert wird. Ich möchte die gültigen Optionen als eine Klassenvariable speichern, auf die der Setter verweisen kann, aber ich habe festgestellt, dass innerhalb der @var.setter Option Ich bin nicht in der Lage, Klassenvariablen überhaupt zu referenzieren.Warum kann @ var.setter nicht auf Zugriffsklassenvariablen zugreifen?

Warum ist das?

Code-Beispiel:

class Standard(): 
    def __init__(self): 
     self.variable1 = 1 
     self.variable2 = 2 

    @property 
    def variable1(self): 
     # This works 
     print(self.variable2) 
     return self.__variable1 

    @variable1.setter 
    def variable1(self, var): 
     # This doesn't work 
     print(self.variable2) 
     self.__variable1 = var 

x = Standard() 
print(x.variable1) 
x.variable1 = 4 
print(x.variable1) 

Diese Ausgänge:

AttributeError: 'Standard' object has no attribute 'variable2' 

Wenn es eindeutig der Fall ist.

+1

'self.variable2' ist noch nicht e xist, wenn Sie 'self.variable1' zuweisen. – vaultah

+0

Haben Sie "self.variable1" absichtlich in "__init__' gesetzt? Oder meinst du "self .__ variable1"? –

Antwort

4

Sie sind erstevariable1 in __init__ Einstellung:

def __init__(self): 
    self.variable1 = 1 
    self.variable2 = 2 

Da self.variable1 von @variable1.setter gehandhabt wird, variable2 kann zu diesem Zeitpunkt noch nicht. Sie könnten Swap die beiden Linien:

def __init__(self): 
    self.variable2 = 2 
    self.variable1 = 1 

Jetzt variable2 richtig vor variable1.setter läuft gesetzt.

Alternativ geben variable2 ein Klassenattribut als Standard zu handeln:

class Standard(): 
    # ... 

    variable2 = 'class default' 

    @variable1.setter 
    def variable1(self, var): 
     print(self.variable2) 
     self.__variable1 = var 

oder verwenden getattr() auf self:

@variable1.setter 
def variable1(self, var): 
    print(getattr(self, 'variable2', 'not available yet')) 
    self.__variable1 = var 

oder __variable1 direkt eingestellt, die Setter-Umgehung:

class Standard(): 
    def __init__(self): 
     self.__variable1 = 1 # don't use the setter 
     self.variable2 = 2 
+0

Wow, du hast mir so viel beigebracht! Vielen Dank! – Mallow

Verwandte Themen