Nützlichkeit von @property in diesem Fall

8

Gegeben die folgende Klasse:

%Vor%

Ich verstehe nicht, warum sie in diesem Fall die Eigenschaftsfunktion verwenden. Mit dem Property Decorator für die Funktion input_size kann man input_size für ein Objekt aufrufen, nennen wir es Zelle dieser Klasse, aber warum rufen sie nicht einfach cell._input_size auf? Kann mir jemand sagen, warum das nützlich ist?

    
eager2learn 20.03.2016, 18:20
quelle

2 Antworten

6

Die Verwendung von Python-Eigenschaften hat Vorteile gegenüber dem direkten Elementzugriff, den Sie vorschlagen.

Betrachten Sie die Implementierung

%Vor%

gegen

%Vor%

Angenommen, Sie haben foo = Foo() . Im ersten Fall greifen Sie auf das Mitglied als foo.bar zu. Dies bedeutet, dass Sie

tun können %Vor%

Das heißt, Sie haben keine Kontrolle über die Begrenzung von Änderungen an bar . In letzterem Fall jedoch - unter Berufung auf die Konvention nicht Zugriff auf Dinge mit dem Präfix _ , zugegebenermaßen - Sie können

tun %Vor%

aber

%Vor%

wird eine Ausnahme auslösen.

Außerdem können Sie mithilfe von Eigenschaften-Settern steuern, wie bar geändert wird, und Validierungen und andere coole Sachen machen:

%Vor%     
Ami Tavory 20.03.2016, 18:31
quelle
3

(demütiger Meinungsmodus: ON)

Ich denke, es ist ein Missbrauch von Eigenschaften. Damals erkannten C ++ - und Java-Programmierer, dass öffentliche Klassenmitglieder ihren Code fragil machen können. Sie können Ihre Meinung darüber, wie die Daten für diese Variable generiert werden, nicht ändern, ohne die Klassenschnittstelle zu ändern und die Rückwärtskompatibilität zu brechen. Also begannen die Leute mit Getter und Setter (Funktionen, die auf private Mitglieder zugreifen) für zusätzliche Flexibilität und es gab einen Push, um alle Mitglieder zu verstecken ... nur für den Fall.

Wenn andere Sprachen formalisierte Eigenschaften hatten, hatten sie manchmal das gleiche Problem mit Klassenschnittstellen. Sie konnten nicht von einer Variablen zu einer Eigenschaft wechseln, ohne die Schnittstelle zu ändern und noch einmal die Rückwärtskompatibilität zu brechen. Also, es gab einen Push, um alle Variablen Eigenschaften zu machen ... nur für den Fall.

Python ist nicht so. Sie können das Mitglied foo heute haben, es morgen in eine Eigenschaft ändern und die Klassenschnittstelle ändert sich nicht. Für mich ist dies nur eine defensive Kodierungspraxis aus einer anderen Sprache und wird hier nicht benötigt.

(demütiger Meinungsmodus: AUS)

    
tdelaney 20.03.2016 18:51
quelle

Tags und Links