Dynamically creating class properties

Paul Hankin paul.hankin at gmail.com
Fri Oct 5 00:55:42 CEST 2007

On Oct 4, 9:59 pm, Karlo Lozovina <_karlo_ at _mosor.net> wrote:
> Hi all,
> this is my problem: lets say I have a arbitrary long list of attributes
> that I want to attach to some class, for example:
>      l = ['item1', 'item2', 'item3']
> Using metaclasses I managed to create a class with those three
> attributes just fine. But now I need those attributes to be properties,
> so for example if 'A' is my constructed class, and 'a' an instance of
> that class:
>     a = A()
> Now if I write:
>     a.item1 = 'something'
>     print a.item1
> I want it to be actually:
>     a.setitem1('something')
>     print a.getitem1
> Any idea how to do that with metaclasses and arbitrary long list of
> attributes? I just started working with them, and it's driving me nuts :).

No metaclasses, but how about this?

def make_class(name, attributes):
    # Build class dictionary.
    d = dict(_attributes=list(attributes))
    # Add in getters and setters from global namespace.
    for attr in attributes:
        d[attr] = property(globals()['get' + attr],
            globals()['set' + attr])
    # Construct our class.
    return type(name, (object,), d)

# Test code:

def getitem1(self):
    return self._fred + 1

def setitem1(self, value):
    self._fred = value

A = make_class('A', ['item1'])
a = A()

a.item1 = 19
print a.item1

>> 20

You didn't say where the getters and setters (here 'getitem1',
'setitem1', etc.) come from. I've assumed from the global namespace
but you probably want to change that.

Paul Hankin

More information about the Python-list mailing list