Dynamic subclassing ?

James T. Dennis jadestar at idiom.com
Sun Jun 10 23:16:12 CEST 2007

Karlo Lozovina <_karlo_ at _mosor.net> wrote:
> manatlan wrote:

>> I can't find the trick, but i'm pretty sure it's possible in an easy
>> way.

> It's somewhat easy, boot looks ugly to me. Maybe someone has a more 
> elegant solution:

> In [6]: import new

> In [13]: class Button:
>    ....:     def buttonFunc(self):
>    ....:         pass

> In [14]: class ExtensionClass:
>    ....:     def extendedMethod(self):
>    ....:         pass

> In [15]: hybrid = new.instance(Button, 
> Button.__dict__.update(ExtensionClass.__dict__))

> In [17]: dir(hybrid)
> Out[17]: ['__doc__', '__module__', 'buttonFunc', 'extendedMethod']

> Seems to do what you want it to do.

> HTH,
> Karlo.

 When I try something like this I run into a little problem:

	class Foo:
	    def foo(self):
	        return "foo"
	class Bar:
	    def bar(self):
	        return "bar"

	f = Foo()

 ... the problem is that while f now has a "bar" method it doesn't
 work quite like a normal instance method:

	>>> f.bar()
	Traceback (most recent call last):
	  File "<stdin>", line 1, in ?
	TypeError: bar() takes exactly 1 argument (0 given)

 ... though I can get by with f.bar(f)

 This "new" module seems to be the key to it all; but the only
 docs I have for that say:

>>> help(new)
Help on module new:

    new - Create new objects of various types.  Deprecated.



    This module is no longer required except for backward compatibility.
    Objects of most types can now be created by calling the type object.

 ... which sounds like a bad idea (from the word "Deprecated").

Jim Dennis,
Starshine: Signed, Sealed, Delivered

More information about the Python-list mailing list