Adding method to class at run-time: bad style?
Gabriel Genellina
gagsl-py2 at yahoo.com.ar
Wed Apr 8 01:09:29 EDT 2009
En Tue, 07 Apr 2009 20:45:15 -0300, Grant Edwards <grante at visi.com>
escribió:
> On 2009-04-07, Scott David Daniels <Scott.Daniels at Acm.Org> wrote:
>> Grant Edwards wrote:
>>> On 2009-04-07, Scott David Daniels <Scott.Daniels at Acm.Org> wrote:
>>>
>>>>> File "/usr/lib/python2.5/site-packages/ClientForm.py", line
>>>>> 2016, in add_to_form
>>>>> Control.add_to_form(self, form)
>>>>> TypeError: unbound method add_to_form() must be called with
>>>>> FancyControl instance as first argument (got CheckboxControl
>>>>> instance instead)
>>>
>>>> The monkey-patching only happens after the ClientForm module
>>>> has been executed (first import), and the monkey-patching
>>>> happens after all of that. So now the "tack it into the
>>>> class" method looks a bit better if you cannot simply add your
>>>> requirement to the ClientForm source.
>>>
>>> That's obviously the "right thing", but it makes portability
>>> more of an issue (I would have to archive/distribute ClientForm
>>> source and users would have to install the customized version
>>> of ClientForm).
>>>
>>> Of course there's always the chance that my version of
>>> monkey-patching will stop working with a different version of
>>> ClientForm. We'll burn that bridge when we come to it.
>>
>> What you might use as a half-way measure:
>>
>> class Mixin: # or class Mixin(object) if new-style:
>> def __eq__(self, other):
>> return (self.type == other.type ...
>> def __ne__(self, other):
>> return not self.__eq__(other)
>> class FancyControl(MixIn, ClientForm.Control): pass
>> class FancyCheckboxControl(MixIn, ClientForm.CheckboxControl): pass
>> ..
>> ClientForm.Control = FancyControl
>> ClientForm.CheckboxControl = FancyCheckboxControl
>
> That would work -- but there are probably 8 or 10 different
> Control subclasses. It's a bit tedious mixing them all one at a
> time, and you need more "inside" information (the names of all
> the different subclasses).
New style classes have a __subclasses__() method that could be used to
find all of them (*at a certain moment*) -- but considering all the
issues, I think that monkey-patching the base class is the "less bad"
option in this case...
--
Gabriel Genellina
More information about the Python-list
mailing list