Python: get vs getattr vs getattribute

__getattr__ is [only] invoked if the attribute is not defined in the instance and it was not found.

__getattribute__ is invoked before looking for the attribute in the object instance. It has precedence over __getattr__

There is also some difference in the behavior related to old style classes vs new style classes.

Descriptors

Descriptors allow us to intercept an instance's get/set/delete calls. If we omit the __get__ or the __delete__ we will be effectively removing such operation. Note that if you want to make the attribute read only, you should implement __set__ and just pass.

class Descriptor(object):
    def __get__(self, instance, owner):
        return instance._name
    def __set__(self, instance, value):
        instance._name = " ".join([e.capitalize() for e in value.split()])

class Person(object):
    name = Descriptor()

Getters and setters: decorators

We use the @property for the getter, and @<prop>.setter where prop is the name of the property.

class Person(object):
    @property
    def name(self):
        return self._name

    @name.setter
    def name(self, name):
        self._name = " ".join([e.capitalize() for e in name.split()])

    @property
    def age(self):
        return self._age

    @age.setter
    def age(self, age):
        self._age = age

Properties

We could also use the built in property function.

attribute = property(get, set, del, doc)
class Person(object):
    def set_name(self, name):
        self._name = " ".join([e.capitalize() for e in name.split()])
    def get_name(self):
        return self._name
    name = property(get_name, set_name)