When an attribute is not found
object.__getattr__ is called. Is there an equivalent way to intercept undefined methods?
Methods are attributes too.
__getattr__ works the same for them:
class A(object): def __getattr__(self, attr): print attr
>>> a = A() >>> a.thing thing >>> a.thing() thing Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'NoneType' object is not callable
There is no difference. A method is also an attribute. (If you want the method to have an implicit "self" argument, though, you'll have to do some more work to "bind" the method).
you didn't return anything.
class A(object): def __getattr__(self, attr): return attr
If one wants the attribute to behave like a method, provide a function!
E.g. to make
class A: def __init__(self, id): self.id = id def __getattr__(self, name): def inner(): return self.id, name return inner
>>> a = A(42) >>> a.thing <function __main__.inner> >>> a.thing() (42, 'thing')