2017-08-25 3 views
-3

Ich habe ein Tutorial Buch für Python gelesen und es kurz über Eigenschaften diskutiert. Soweit ich weiß, leitet python bei Anforderung eines Klassenattributs die Anforderung an die property-Methode weiter, die das Attribut zurückgibt, damit der Code ausgeführt werden kann, bevor auf das Attribut zugegriffen wird. Aber warum ist das notwendig, wenn im folgenden Beispiel das Attribut v, das zurückgegeben wird, nicht einmal mit Punktnotation aufgerufen werden kann?Warum sollte ich den @property-Dekorator in Python verwenden?

@property 
def value(self): 
    if self.is_face_up: 
     v = BJ_Card.RANKS.index(self.rank) + 1 
     if v > 10: 
      v = 10 
    else: 
     v = None 
    return v 
+2

_ „das Attribut zurückgegeben werden kann nicht einmal mit Punktnotation zugegriffen werden“ _ Was meinen Sie? 'YourClass(). Value' funktioniert gut. –

+0

Ja, ich weiß jetzt, dass Sie Punkt-Notation auf der Methode verwenden können - wie die Variable v. Als ich die Frage schrieb, war ich verwirrt, weil ich die Variable v nicht durch Eingabe von MyClass.v bekommen konnte, aber jetzt weiß ich das das ist nicht notwendig, da Sie die Methode einfach aufrufen können. –

Antwort

1

Das Attribut kann nicht mit Punktschreibweise innerhalb der Funktion weil die rekursiv Getter der Eigenschaft zugegriffen werden würde anrufen und einen Stapelüberlauf verursachen:

class A: 
    @property 
    def x(self): 
     return self.x # StackOverflow 

Jedoch ist der springende Punkt der @propertygenau, um es mit Punktnotation zugänglich zu machen. Die folgenden sind äquivalent:

# Without @property 
class A: 
    def x(self): 
     return 3 

a = A() 
print(a.x()) # prints 3 

# With @property 
class A: 
    @property 
    def x(self): 
     return 3 

a = A() 
print(a.x) # prints 3 
+0

Also, nur um zu klären, wenn Sie den Property-Decorator verwenden, behandeln Sie die Methode wie ein Attribut. Ist es nur eine Möglichkeit, ein Attribut für eine Klasse zu erstellen, aber damit es kontrolliert werden kann? –

+1

@IsaacJohnson: Ja, eine '@ Eigenschaft' übersetzt den Attributzugriff auf einen Methodenaufruf und macht das Attribut dynamisch. –

+0

Danke, ich war so verwirrt, aber du hast wirklich alles für mich erledigt. :) –

Verwandte Themen