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. .. code:: python 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. .. code:: python 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. .. code:: python 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 References ---------- - `Python Built-in Functions - property `_ - `dirtSimple - Python Is Not Java `_ - `Stack Overflow - What's the Pythonic Way to use getters and setters? `_