adding properties dynamically (how to?)

Rafe rafesacks at gmail.com
Tue Aug 19 13:57:01 EDT 2008


On Aug 17, 7:51 pm, André <andre.robe... at gmail.com> wrote:
> I didn't want to hijack the original thread but I have basically the
> same request...
>
> On Aug 17, 7:09 am, Bruno Desthuilliers<bdesth.quelquech... at free.quelquepart.fr> wrote:
> > akonsu a écrit :> hello,
>
> [SNIP]
>
>
>
> > Wrong solution to your problem, I'd say. Let's start again:
>
> > """
> >  > i need to add properties to instances dynamically during run time.
> >  > this is because their names are determined by the database contents.
> > """
>
> > Care to elaborate ? I may be wrong, but I suspect you're trying to roll
> > your own python/database mapper. If so, there are quite a couple Python
> > ORMs around. Else, please tell us more.
>
> I'm not the original poster, but I'd like to do the same thing (for a
> different reason).
>
> I have a program (crunchy) that is extensible via plugins.  New
> options available via plugins can be turned on or off (or selected
> among a list of options).  I have a module for user preferences (let's
> call it prefs.py) that allows the setting of these options (and do
> error checking, automatic saving of the options selected for future
> sessions, etc.).  These options are implemented as properties.
>
> Currently I have it simplified so that only two lines need to be added
> to prefs.py to add new options; something like
> options = { ...
>     'new_option': [value1, value2, ..., valueN],
> ...}
>
> and
> class Preferences(object):
> ...
>
>    new_option = make_property('new_option', 'some nicely worded help
> string')
>
> ===
> make_property is a custom define function that return fgets, fsets,
> fdel and doc.
>
> Ideally, I'd like to be able to define new would-be properties from
> the plugin and add them to the class prior to creating instances.  In
> other words, have something like
>
> ===
> for option in options_defined_in_plugins:
>    add_option_as_property_to_Preferences(Preferences, option, ...)
>
> user_preferences = Preferences()
>
> Performance in this case would not be an issue.
>
> Cheers,
>
> André

You can dynamicly add properties to a class just before returning the
instance using __new__():

class AClass(object):
    def __new__(cls):

        setattr(cls,"active", property(fget = ...,
                                        fset = ...,
                                        fdel = ...,
                                        doc  = ...))

        obj = super(BaseGroup, cls).__new__(cls)
        return obj


You can put this in a for loop and add a property per option, etc.

- Rafe



More information about the Python-list mailing list