__getattr__ related question

Oleg Broytmann phd at phd.pp.ru
Wed Dec 12 08:25:15 EST 2001


On Wed, Dec 12, 2001 at 12:38:28PM -0000, dominikush wrote:
> the __getattr__ method causes me some headache. To prohibit unwanted
> method calls of an object, I shield it by an interface object. So,
> all method calls are addressed to the interface object. That means
> the user calls
> 
>     capsuleInterface.send("Hallo")
> 
> instead of directly calling capsule.send("Hallo"), see example
> below. The __getattr__ in Port catches the call and returns the
> send() method of Capsule. However, evaluating the method fails
> 
>     >>> capsuleInterface.send("Hallo")
>     Traceback (most recent call last):
>       File "<stdin>", line 1, in ?
>     TypeError: not enough arguments; expected 2, got 1

   Looks like the wrapper does not pass "self" as a first rgument.

>     def __getattr__(self,name):
>         if name in self.methods:
>             try:
>                 return self.component.__class__.__dict__[name]
>             except KeyError, error:
>                 raise AttributeError, error
>         raise AttributeError, name+" is not known to port"

   Aha, here is the error:
>                 return self.component.__class__.__dict__[name]
   This returns *unbound* method. Return a *bound* method instead:
return getattr(self.component, name)

Oleg.
-- 
     Oleg Broytmann            http://phd.pp.ru/            phd at phd.pp.ru
           Programmers don't die, they just GOSUB without RETURN.




More information about the Python-list mailing list