Mixing classes...

Hans Nowak hans at zephyrfalcon.org
Fri Aug 20 03:12:25 CEST 2004


Ivan Voras wrote:
> Is this possible:
> 
> class C1:
>     def somemethods(self):
>         """methods do stuff, create member variables"""
>         pass
> 
> def f1():
>     """function returns instances of C1, somewhat manipulated into 
> specific states"""
>     return C1()
> 
> 
> class C2(C1): # C2 derives from C1
>     def othermethods(self):
>         """new methods are introduced, but no new member variables (they 
> work on existing ones)"""
>         pass
> 
> 
> 
> # So far, everything's ok. Now, i want to create instance of
> # C1 using f1:
> 
> c = f1()  # could be equal to "c=C1()", but not always...
> 
> # ... and somehow "add" or "overlay" the additional methods
> # declared in C2 on the object "c". I tried this:
> 
> c.othermethods=C2.othermethods
> 
> c.othermethods() # fails here, is confused about what is 'self'
> 
> 
> #######
> While this is probably considered "strange", and it's certainly not good 
> design style, I somehow feel it could be possible to do in python. Any 
> clues?

Use new.instancemethod:

 >>> class C1:
...     def somemethods(self):
...         print 'somemethods'
...
 >>> def f1():
...     return C1()
...
 >>> class C2(C1):
...     def othermethods(self):
...         print 'othermethods'
...
 >>> c = f1()
 >>> c.somemethods()
somemethods
 >>> import new
 >>> c.othermethods = new.instancemethod(C2.othermethods.im_func, c, c.__class__)
 >>> c.othermethods()
othermethods

HTH,

--
Hans Nowak (hans at zephyrfalcon.org)
http://zephyrfalcon.org/




More information about the Python-list mailing list