On Thu, 04 Dec 2008 06:23:28 -0800, k3xji wrote: > Hi, > > Is there a way to hook a function call in python? I know __getattr__ is > doing for variables,
What do you mean "variables"? Do you mean attributes? > it is giving us a chance before a field is > initialized. What field? Is a field the same as a variable, or something else? > Do we have same functionality for methods? Yes, methods are attributes too, they are reached by the exact same mechanism as any other attribute. Any object with a __call__ method can be called. Normally you create objects with a __call__ method by using def or lambda. > Example: > > class Foo(object): > def __call_method__(self, ...) # just pseudo > print 'A method is called in object...' > > f = Foo() > f.test_method() > > I think you understand my point. I wish I did. It might have helped if you actually showed the expected output of your "test_method", instead of expecting us to *guess* what you expect to happen. I'm going to guess what you mean, and show you one possible solution. Read it carefully: it shows three examples of __getattr__, starting from the simplest to the relatively complicated. class Parrot(object): def __getattr__(self, name): if name == "colour": return "red" elif name == "talk": return lambda x: "Hi, I'm %s the talking parrot" % x elif name == "speak": class Birdy(object): def __init__(self, name): self.name = name def __call__(self): return "I'm the talking Parrot %s" % self.name return Birdy('Fred') else: raise AttributeError And in use: >>> p = Parrot() >>> p.colour 'red' >>> p.talk # get the attribute "talk" <function <lambda> at 0x81fab1c> >>> >>> p.talk("Fred") # call the attribute (method) "talk" "Hi, I'm Fred the talking parrot" >>> >>> p.speak <__main__.Birdy object at 0x820076c> >>> p.speak() "I'm the talking Parrot Fred" -- Steven -- http://mail.python.org/mailman/listinfo/python-list