Dynamic subclassing ?
Bruno Desthuilliers
bdesth.quelquechose at free.quelquepart.fr
Sun May 13 09:55:22 EDT 2007
manatlan a écrit :
> On 12 mai, 17:00, Bruno Desthuilliers
> <bdesth.quelquech... at free.quelquepart.fr> wrote:
>
>>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"
>>
>>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()
>
>
> except that "b" is not anymore a "gtk.Button", but a "MoreMethods"
> instance ...
> i'd like that "b" stay a "gtk.Button" ...
>
I don't understand why, but... Then write a function that "inject" all
the additionnal methods to your gtk.Button. Or do the
composition/delegation the other way round, and monkeypatch gtk.Button's
__getattr__.
More information about the Python-list
mailing list