creating many similar properties

Michele Simionato michele.simionato at gmail.com
Wed Oct 18 02:43:49 EDT 2006


Lee Harr wrote:
> I understand how to create a property like this:
>
> class RC(object):
>     def _set_pwm(self, v):
>         self._pwm01 = v % 256
>     def _get_pwm(self):
>         return self._pwm01
>     pwm01 = property(_get_pwm, _set_pwm)
>
>
> But what if I have a whole bunch of these pwm properties?
>
> I made this:
>
> class RC(object):
>     def _makeprop(name):
>         prop = '_%s' % name
>         def _set(self, v):
>             v_new = v % 256
>             setattr(self, prop, v_new)
>         def _get(self):
>             return getattr(self, prop)
>         return property(_get, _set)
>
>     pwm01 = _makeprop('pwm01')
>     pwm02 = _makeprop('pwm02')
>
>
> Not too bad, except for having to repeat the name.
>
> I would like to just have a list of pwm names and
> have them all set up like that. It would be nice if
> each one was set to a default value of 127 also....
>
> Any thoughts?
>

Yes, what about this?

import sys

def defprop(name, default=127):
    loc = sys._getframe(1).f_locals
    prop = '_%s' % name
    def _set(self, v):
        v_new = v % 256
        setattr(self, prop, v_new)
    def _get(self):
        return getattr(self, prop, default)
    loc[name] = property(_get, _set)

class RC(object):
    defprop('pwm01')
    defprop('pwm02')

rc = RC()

print rc.pwm01 # 127
print rc.pwm02 # 127
rc.pwm02 = 1312
print rc.pwm02 # 32

This is a bit hackish, but I would prefer this over a metaclass
solution. since it does not add
any hidden magic to your class.

          Michele Simionato




More information about the Python-list mailing list