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