Hier ist ein weiteres Beispiel:
##
## Python-Eigenschaftenbeispiel
##
class GetterSetterBeispiel( object ):
## Setzen Sie den Standardwert für x (wir verweisen darauf, indem wir self.x verwenden, setzen einen Wert mit self.x = Wert )
__x = None
##
## Bei Klasseninitialisierung - etwas tun... wenn wir wollen..
##
def __init__( self ):
## Setzen Sie einen Wert für __x über den Getter / Setter... Da __x oben definiert ist, muss dies nicht gesetzt werden...
self.x = 1234
return None
##
## Definieren Sie x als Eigenschaft, d.h. als Getter - Alle Getter sollten ein Standardwert-Argument haben, daher habe ich es hinzugefügt - es wird nicht übergeben, wenn ein Wert festgelegt wird, daher müssen Sie es hier festlegen, damit es verwendet wird..
##
@property
def x( self, _default = None ):
## Ich habe ein optionales Standardwertargument hinzugefügt, da alle Getter dies haben sollten - setzen Sie es auf den Standardwert, den Sie zurückgeben möchten...
_value = ( self.__x, _default )[ self.__x == None ]
## Debugging - damit Sie die Reihenfolge der Aufrufe sehen können...
print( '[ Testklasse ] Get x = ' + str( _value ) )
## Gib den Wert zurück - schließlich sind wir ein Getter...
return _value
##
## Definieren Sie die Setter-Funktion für x...
##
@x.setter
def x( self, _value = None ):
## Debugging - damit Sie die Reihenfolge der Aufrufe sehen können...
print( '[ Testklasse ] Setzen x = ' + str( _value ) )
## Dies soll zeigen, dass die Setter-Funktion funktioniert.... Wenn der Wert über 0 liegt, setzen Sie ihn auf einen negativen Wert... andernfalls behalten Sie ihn bei ( 0 ist die einzige nicht-negative Zahl, sie kann weder negativ noch positiv sein )
if ( _value > 0 ):
self.__x = -_value
else:
self.__x = _value
##
## Definieren Sie die Löschfunktion für x...
##
@x.deleter
def x( self ):
## Entladen Sie die Zuweisung / Daten für x
if ( self.__x != None ):
del self.__x
##
## Zu Zeichenfolge / Ausgabefunktion für die Klasse - diese zeigt den Eigenschaftswert für jede hinzugefügte Eigenschaft an...
##
def __str__( self ):
## Gib die x-Eigenschaftsdaten aus...
print( '[ x ] ' + str( self.x ) )
## Gib eine neue Zeile zurück - technisch gesehen sollten wir eine Zeichenfolge zurückgeben, damit sie dort gedruckt werden kann, wo wir sie möchten, anstatt frühzeitig gedruckt zu werden, wenn _data = str( C( ) ) verwendet wird....
return '\n'
##
##
##
_test = GetterSetterBeispiel( )
print( _test )
## Aus irgendeinem Grund wird der Deleter nicht aufgerufen...
del _test.x
Grundsätzlich dasselbe wie das C( object )-Beispiel, außer dass ich x verwende... Außerdem initialisiere ich nicht in __init - ... nun.. ich mache es schon, aber es kann entfernt werden, weil __x als Teil der Klasse definiert ist....
Die Ausgabe ist:
[ Testklasse ] Setzen x = 1234
[ Testklasse ] Get x = -1234
[ x ] -1234
und wenn ich das self.x = 1234 in init auskommentiere, dann ist die Ausgabe:
[ Testklasse ] Get x = None
[ x ] None
und wenn ich das _default = None auf _default = 0 im Getter (da alle Getter ein Standardwert haben sollten, der jedoch nicht über die Eigenschaftswerte übergeben wird, wie ich gesehen habe, können Sie ihn hier definieren, und es ist tatsächlich nicht schlecht, da Sie den Standardwert einmal definieren können und ihn überall verwenden können ) also: def x( self, _default = 0 ):
[ Testklasse ] Get x = 0
[ x ] 0
Hinweis: Die Getter-Logik ist vorhanden, um sicherzustellen, dass der Wert durch sie bearbeitet wird, um sicherzustellen, dass er durch sie bearbeitet wird - das gleiche gilt für die Druckanweisungen...
Hinweis: Ich bin es gewohnt, Lua zu verwenden und in der Lage zu sein, beim Aufrufen einer einzelnen Funktion dynamisch 10+ Helfer zu erstellen, und ich habe etwas Ähnliches für Python ohne die Verwendung von Eigenschaften erstellt, und es funktioniert bis zu einem gewissen Grad, aber auch wenn die Funktionen erstellt werden bevor sie verwendet werden, gibt es manchmal Probleme damit, dass sie aufgerufen werden, bevor sie erstellt werden, was seltsam ist, da es nicht so codiert ist... Ich bevorzuge die Flexibilität von Lua-Meta-Tabellen und die Tatsache, dass ich tatsächliche Setter / Getter verwenden kann, anstatt im Wesentlichen direkt auf eine Variable zuzugreifen.... Mir gefällt, wie schnell einige Dinge mit Python erstellt werden können - zum Beispiel GUI-Programme. obwohl eines, das ich entwerfe, möglicherweise ohne viele zusätzliche Bibliotheken nicht möglich ist - wenn ich es in AutoHotkey codiere, kann ich direkt auf die dll-Aufrufe zugreifen, und dasselbe kann in Java, C#, C++, und mehr getan werden - vielleicht habe ich noch nicht das Richtige gefunden, aber für dieses Projekt könnte ich von Python zu Anfangen wechseln..
Hinweis: Die Codeausgabe in diesem Forum ist fehlerhaft - Ich musste Leerzeichen am Anfang des Codes hinzufügen, damit es funktioniert - beim Kopieren / Einfügen stellen Sie sicher, dass Sie alle Leerzeichen in Tabs umwandeln.... Ich verwende Tabs für Python, weil in einer Datei mit 10.000 Zeilen die Dateigröße mit Leerzeichen 512KB bis 1MB betragen kann und mit Tabs 100 bis 200KB, was einen massiven Unterschied in der Dateigröße und Zeit für die Verarbeitung bedeutet...
Tabs können auch pro Benutzer angepasst werden - wenn Sie also eine Breite von 2 Spaces, 4, 8 oder was auch immer bevorzugen, können Sie sie verwenden, was für Entwickler mit Sehbehinderungen gedacht ist.
Hinweis: Alle in der Klasse definierten Funktionen sind wegen eines Fehlers in der Forumssoftware nicht korrekt eingerückt - stellen Sie sicher, dass Sie sie einrücken, wenn Sie kopieren / einfügen