Why are so many built-in types inheritable?

Kent Johnson kent at kentsjohnson.com
Sat Mar 25 05:25:07 CET 2006

Fabiano Sidler wrote:
> Hi folks!
> For debugging purposes I tried this:
> --- snip ---
> def foo(): pass
> function = type(foo)
> class PrintingFunction(function):
>   def __init__(self, func):
>     self.func = func
>   def __call__(self, *args, **kwargs):
>     print args, kwargs
>     return function.__call__(self, args, kwargs)
> class DebugMeta(type):
>   def __new__(self, name, bases, dict):
>     for name in dict:
>       if type(dict[name]) is function:
>         dict[name] = PrintingFunction(dict[name])
> --- snap ---
> Now I tought I were able to let all maethod of classes with DebugMeta as
> metaclass print out their arguments. But I got the following sad error:
> TypeError: Error when calling the metaclass bases
>     type 'function' is not an acceptable base type
> That's awful, isn't it?
> What could I do to get the above code working? (No, I disliked to re-
> implement <type 'function'> without this unpleasant behaviour in Python.)

You could do this with a simple decorator:

or I think your class PrintingFunction would work as
class PrintingFunction(object):
   def __init__(self, func):
     self.func = func
   def __call__(self, *args, **kwargs):
     print args, kwargs
     return self.func(*args, **kwargs)


More information about the Python-list mailing list