manatlan a écrit :
> I've got an instance of a class, ex :
> 
> b=gtk.Button()
> 
> I'd like to add methods and attributes to my instance "b".
> I know it's possible by hacking "b" with setattr() methods.

You don't even need setattr() here, you can set the attributes directly.


> But i'd
> like to do it with inheritance, a kind of "dynamic subclassing",
> without subclassing the class, only this instance "b" !
> 
> In fact, i've got my instance "b", and another class "MoreMethods"
> 
> class MoreMethods:
>     def  sayHello(self):
>           print "hello"
> 
> How could i write ...
> 
> "b = b + MoreMethods"
> 
> so "b" will continue to be a gtk.Button, + methods/attributs of
> MoreMethods (it's what i call "dynamic inheritance") ...so, things
> like this should work :
> 
> - b.set_label("k")
> - b.sayHello()
> 
> I can't find the trick, but i'm pretty sure it's possible in an easy
> way.

You don't necessarily need subclassing here. What you want is a typical 
use case of the Decorator pattern:

class MoreMethods(object):
   def __init__(self, button):
     self._button = button

   def  sayHello(self):
     print "hello"

   def __getattr__(self, name):
     return getattr(self._button, name)

   def __setattr__(self, name, value):
     if name in dir(self._button):
       setattr(self._button, name, value)
     else:
       object.__setattr__(self, name, value)

b = MoreMethods(gtk.Button())
b.set_label("k")
b.say_hello()

-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to