https://docs.python.org/3/library/functions.html
@property helps to manipulate attributes.
# First approach.
class Engine:
def __init__(self):
self.temperature = 0
e = Engine()
assert e.temperature == 0 # like getT() in C++
e.temperature = 100 # like setT(value) in C++
assert e.temperature == 100
del e.temperature
#print(e.temperature) # AttributeError
# Second approach with the extended usability.
# The interface of the Engine class is not changed!
#class Engine(object): # Py2
class Engine: # Py3
def __init__(self):
self._t = 0 # the private variable
@property
def temperature(self):
"""I'm the 'temperature' property."""
return self._t
@temperature.setter
def temperature(self, value):
if value < 0:
raise ValueError("temperature less then zero")
self._t = value
@temperature.deleter
def temperature(self):
del self._t # better self._t = 0 (?)
e = Engine()
assert e.temperature == 0
e.temperature = 100
assert e.temperature == 100
#e.temperature = -1 # ValueError: temperature less then zero
del e.temperature
#print(e.temperature) # AttributeError: 'Engine' object has no attribute '_t'