class OldResistor(object):
def __init__(self, ohms):
self._ohms = ohms
def get_ohms(self):
return self._ohms
def set_ohms(self, ohms):
self._ohms = ohms
r0 = OldResistor(50e3)
print('Before: %5r' % r0.get_ohms())
r0.set_ohms(10e3)
print('After: %5r' % r0.get_ohms())
Before: 50000.0 After: 10000.0
@property
decorator and setter
attributeclass Resistor(object):
def __init__(self, ohms):
self.ohms = ohms
self.voltage = 0
self.current = 0
class VoltageResistance(Resistor):
def __init__(self, ohms):
super().__init__(ohms)
self._voltage = 0
@property
def voltage(self):
return self._voltage
@voltage.setter
def voltage(self, voltage):
self._voltage = voltage
self.current = self._voltage / self.ohms
r2 = VoltageResistance(1e3)
print('Before: %5r amps' % r2.current)
r2.voltage = 10
print('After: %5r amps' % r2.current)
Before: 0 amps After: 0.01 amps
# Using setters to check values and throw exceptions
class BoundedResistance(Resistor):
def __init__(self, ohms):
super().__init__(ohms)
@property
def ohms(self):
return self._ohms
@ohms.setter
def ohms(self, ohms):
if ohms <= 0:
raise ValueError('%f ohms must be > 0' % ohms)
self._ohms = ohms
r3 = BoundedResistance(1e3)
r3.ohms = 0
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-9-16fe06f3ea7a> in <module>() 13 14 r3 = BoundedResistance(1e3) ---> 15 r3.ohms = 0 <ipython-input-9-16fe06f3ea7a> in ohms(self, ohms) 9 def ohms(self, ohms): 10 if ohms <= 0: ---> 11 raise ValueError('%f ohms must be > 0' % ohms) 12 self._ohms = ohms 13 ValueError: 0.000000 ohms must be > 0
@property
to make attributes immutable@property
Instead of Refactoring Attributes¶@property
@property
too heavily@property
Methods¶@property
is that the methods it decorates can't be reused for multiple attributes of the same class. They also can't be reused by unrelated classesclass Homework(object):
def __init__(self):
self._grade = 0
@property
def grade(self):
return self._grade
@grade.setter
def grade(self, value):
if not (0 <= value <= 100):
raise ValueError('Grade must be between 0 and 100')
self._grade = value
person = Homework()
person.grade = 100