Implementing Java-style getters and setters¶
Python is not Java. If you need to set or get the members of a class or object, just expose the member publicly and access it directly. If you need to perform some computations before getting or setting the member, then use Python’s built-in property
decorator.
Anti-pattern¶
The programmer below comes to Python from a long career as a Java programmer. For every class member that he wants to expose publicly, he defines a get
and set
method for that member. This is common practice in Java, but is frowned upon in Python as a waste of time and a cause of unnecessary code.
class Square(object):
def __init__(self, length):
self._length = length
# Java-style
def get_length(self):
return self._length
# Java-style
def set_length(self, length):
self._length = length
r = Square(5)
r.get_length()
r.set_length(6)
Best practice¶
Access the members directly¶
In Python it is acceptable to simply access class or object members directly. The modified code below exposes the length
member as a public member. This is signified by the fact that there is no underscore character at the beginning of the member name. The get_length()
and set_length()
methods are no longer necessary so they have been deleted.
class Square(object):
def __init__(self, length):
self.length = length
r = Square(5)
r.length
r.length = 6
Use built-in property
decorator¶
When a member needs to be slightly protected and cannot be simply exposed as a public member, use Python’s property
decorator to accomplish the functionality of getters and setters.
class Square(object):
def __init__(self, length):
self._length = length
@property
def length(self):
return self._length
@length.setter
def length(self, value):
self._length = value
@length.deleter
def length(self):
del self._length
r = Square(5)
r.length # automatically calls getter
r.length = 6 # automatically calls setter