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