Einige objektorientierte Sprachen haben sogenannte private Attribute, auf die von außerhalb der Klassenmethoden nicht zugegriffen werden kann. Dies ist wichtig, da einige Attribute nicht direkt geändert werden sollen, sondern sie als eine Funktion von etwas anderem geändert oder validiert werden sollen, bevor sie geändert werden. In Python haben Sie keine private Attribute, aber Sie können etwas ähnliches implementieren, indem Sie Getter und Setter zu einer Variablen verwenden, die mit Unterstrich beginnt - Pythons Konvention für private Methoden und Attribute.
Zum Beispiel. Die Hypotenuse eines rechtwinkligen Dreiecks ist gegeben durch h=sqrt(a*a+b*b)
, so dass Sie h
nicht direkt ändern können, weil die Beziehung gelten muss. Auch sagen, dass ein Name mich im Format LASTNAME COMMA FIRSTNAME
haben muss, dann müssen Sie überprüfen, dass dies der Fall ist, bevor Sie self.lastname
zuweisen.
Die Eigenschaft Getter ermöglicht es Ihnen, die Hypotenuse zu erhalten, verbietet Ihnen jedoch, sie festzulegen. Mit dem Eigenschaftensetter können Sie eine Eigenschaft festlegen, Sie können jedoch Prüfungen vornehmen, bevor Sie die Eigenschaft tatsächlich festlegen.
So:
class Person(object)
def __init__(self):
# The actual attribute is _name
self._name = None
@property
def name(self):
# when I ask for the name, I mean to get _name
return self._name
@name.setter
def name(self, value):
# before setting name I can ensure that it has the right format
if regex_name.match(value):
# assume you have a regular expression to check for the name
self._name = value
else:
raise ValueError('invalid name')
Ein weiteres Beispiel:
class Triangle(object):
def __init__(self, a, b):
# here a and b do not need to be private because
# we can change them at will. However, you could
# make them private and ensure that they are floats
# when they are changed
self.a = a
self.b = b
@property
def h(self):
return math.sqrt(a*a+b*b)
# notice there is no h.setter - you cannot set h directly
'return 40' - erinnert mich an Zufallszahlengenerator des xkcd! – katrielalex