python getattr and getatribute

A key difference between __getattr__ and __getattribute__ is that
__getattr__ is only invoked if the attribute wasn’t found the usual ways.
It’s good for implementing a fallback for missing attributes, and is probably
the one of two you want.

__getattribute__ is invoked before looking at the actual attributes on the
object, and so can be tricky to implement correctly. You can end up in infinite
recursions very easily.

New-style classes derive from object, old-style classes are those in Python 2.x
with no explicit base class. But the distinction between old-style and new-style
classes is not the important one when choosing between __getattr__ and
__getattribute__.

usage

this demo fron other people:

class UrlGenerator(object):
    def __init__(self, root_url):
        self.url = root_url

    def __getattr__(self, item):
        if item == 'get' or item == 'post':
            print self.url
        return UrlGenerator('{}/{}'.format(self.url, item))

test the class:

url_gen = UrlGenerator('http://xxxx')
url_gen.users.show.get

will print http://xxxx/users/show and the address of the object.

reference