Die Verwendung von get / set scheint in Java (aus verschiedenen Gründen) eine gängige Praxis zu sein, aber ich sehe kaum Python-Code, der dies verwendet.
Warum verwenden oder vermeiden Sie get / set-Methoden in Python?
python
getter-setter
Roger Pate
quelle
quelle
Antworten:
Cooler Link: Python ist nicht Java :)
quelle
In Python können Sie einfach direkt auf das Attribut zugreifen, da es öffentlich ist:
class MyClass: def __init__(self): self.my_attribute = 0 my_object = MyClass() my_object.my_attribute = 1 # etc.
Wenn Sie beim Zugriff oder bei der Mutation des Attributs etwas unternehmen möchten, können Sie folgende Eigenschaften verwenden :
class MyClass: def __init__(self): self._my_attribute = 0 @property def my_attribute(self): # Do something if you want return self._my_attribute @my_attribute.setter def my_attribute(self, value): # Do something if you want self._my_attribute = value
Entscheidend ist, dass der Client-Code gleich bleibt.
quelle
Hier ist, was Guido van Rossum dazu in Masterminds of Programming sagt
quelle
Nein, es ist unpythonisch. Die allgemein akzeptierte Methode besteht darin, normale Datenattribute zu verwenden und diejenigen, die eine komplexere Get / Set-Logik benötigen, durch Eigenschaften zu ersetzen.
quelle
Die kurze Antwort auf Ihre Frage lautet Nein. Sie sollten bei Bedarf Eigenschaften verwenden. Ryan Tamyoko liefert die lange Antwort in seinem Artikel Getters / Setters / Fuxors
quelle
Ihre Beobachtung ist richtig. Dies ist kein normaler Stil der Python-Programmierung. Attribute sind alle öffentlich, sodass Sie einfach auf sie zugreifen (sie abrufen, festlegen, löschen), wie Sie es mit Attributen eines Objekts tun würden, das sie enthält (nicht nur Klassen oder Instanzen). Es ist leicht zu erkennen, wann Java-Programmierer Python lernen, da ihr Python-Code mit der Python-Syntax wie Java aussieht!
Ich stimme definitiv allen vorherigen Postern zu, insbesondere dem Link von @ Maximiliano zu Philipps berühmtem Artikel und dem Vorschlag von @ Max, dass alles Komplexere als die Standardmethode zum Festlegen (und Abrufen) von Klassen- und Instanzattributen darin besteht, Eigenschaften (oder Deskriptoren zu verwenden, um noch mehr zu verallgemeinern). um das Abrufen und Setzen von Attributen anzupassen! (Dazu gehört, dass Sie Ihre eigenen benutzerdefinierten Versionen von privaten, geschützten, befreundeten oder beliebigen Richtlinien hinzufügen können, wenn Sie etwas anderes als öffentlich wünschen.)
Als interessante Demo habe ich in Core Python Programming (Kapitel 13, Abschnitt 13.16) ein Beispiel für die Verwendung von Deskriptoren zum Speichern von Attributen auf der Festplatte anstatt im Speicher gefunden !! Ja, es ist eine seltsame Form von persistenten Speicher, aber es tut zeigen Ihnen ein Beispiel dessen , was möglich ist!
Hier ist ein weiterer verwandter Beitrag, den Sie möglicherweise ebenfalls nützlich finden: Python: Mehrere Eigenschaften, ein Setter / Getter
quelle
Ich war wegen dieser Antwort hierher gekommen (leider konnte ich nicht). Aber ich habe woanders eine Arbeit gefunden . Dieser folgende Code könnte eine Alternative zum Abrufen sein .
class get_var_lis: def __init__(self): pass def __call__(self): return [2,3,4] def __iter__(self): return iter([2,3,4]) some_other_var = get_var_lis
Dies ist nur eine Problemumgehung . Mit dem obigen Konzept könnten Sie auch in py leicht eine get / set-Methodik erstellen.
quelle
Unser Lehrer zeigte ein Beispiel in der Klasse und erklärte, wann wir Accessor-Funktionen verwenden sollten.
class Woman(Human): def getAge(self): if self.age > 30: return super().getAge() - 10 else: return super().getAge()
quelle