I have been reading some examples of using getter and setter via Python property
object and saw two different implementations but I could not tell what's the difference.
assigning to private variable in __init__
:
class Alphabet:
def __init__(self, value):
self._value = value
# getting the values
def getValue(self):
print('Getting value')
return self._value
# setting the values
def setValue(self, value):
print('Setting value to ' + value)
self._value = value
# deleting the values
def delValue(self):
print('Deleting value')
del self._value
value = property(getValue, setValue,
delValue, )
assigning to property object in __init__
:
class Celsius:
def __init__(self, temperature=0):
self.temperature = temperature
def to_fahrenheit(self):
return (self.temperature * 1.8) + 32
# getter
def get_temperature(self):
print("Getting value...")
return self._temperature
# setter
def set_temperature(self, value):
print("Setting value...")
if value < -273.15:
raise ValueError("Temperature below -273.15 is not possible")
self._temperature = value
# creating a property object
temperature = property(get_temperature, set_temperature)
In Alphabet.__init__
, you don't have the effect of the setter but in Celsius.__init__
you have.
In other words in Celsius.__init__
, you're setting the value of your private variable(you called it, they are not private by that meaning in other languages) through the setter, but in Alphabet.__init__
you're setting it directly.
So if you have any validation in your setter, it's not gonna work while you instantiating your class in Alphabet
, but it will in Celsius
.