class callable with any method name
Imer
mathieu543 at hotmail.com
Wed Apr 10 04:27:09 EDT 2002
bokr at oz.net (Bengt Richter) wrote in message news:<a9054j$iki$0 at 216.39.172.122>...
> On 9 Apr 2002 13:56:09 -0700, mathieu543 at hotmail.com (Imer) wrote:
>
> >Hi, I'm trying to find a way to implement a class that would allow any
> >method name to be called.
> >When that happens, a special method would be called and the name of
> >the method that was originally called would be passed as an argument.
> >
> >For instance:
> >########
> >class A:
> > def __method_called__ (self, method_name, method_argument):
> > print "The method", method_name, "was called with the argument",
> >method_argument
> >########
> >
> >Then the following code:
> >########
> >a=A()
> >a.this_is_a_random_method(arg=1)
> >a.yet_another_random_method(param=3)
> >########
> >
> >Would print out:
> >########
> >The method this_is_a_random_method was called with the argument
> >{'arg':1}
> >The method yet_another_random_method was called with the argument
> >{'param':3}
> >########
> >
> >Is there a way to do that ?
> >
> >Thanks.
>
> No guarantees, but try this:
>
> >>> class A:
> ... def __getattr__(self, attname):
> ... if attname.startswith('__'): return self.__class__.__getattr__(attname)
> ... self._attname = attname
> ... return self._special
> ... def _special(self, *args, **kwds):
> ... print 'The method "%s" was called with the arguments\n%s, %s' % (
> ... self._attname, args, kwds
> ... )
> ...
> >>> a=A()
> >>> a.this_is_a_random_method(arg=1)
> The method "this_is_a_random_method" was called with the arguments
> (), {'arg': 1}
> >>> a.yet_another_random_method(param=3)
> The method "yet_another_random_method" was called with the arguments
> (), {'param': 3}
> >>> a.x()
> The method "x" was called with the arguments
> (), {}
> >>> a.y
> <bound method A._special of <__main__.A instance at 0x007D39E0>>
> >>> a._attname
> 'y'
> >>> a.z
> <bound method A._special of <__main__.A instance at 0x007D39E0>>
> >>> a.z(k=3)
> The method "z" was called with the arguments
> (), {'k': 3}
> >>> a.z(1,2,3)
> The method "z" was called with the arguments
> (1, 2, 3), {}
> >>> a.z(1,2,3, i=4, j=5)
> The method "z" was called with the arguments
> (1, 2, 3), {'i': 4, 'j': 5}
>
> Regards,
> Bengt Richter
Thanks to all of you guys. I didn't know about __getattr__, but I knew
there had to be a way to do it ... Python is so great !
Mathieu.
More information about the Python-list
mailing list