creating many similar properties
James Stroud
jstroud at mbi.ucla.edu
Tue Oct 17 23:36:23 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?
>
> Thanks for your time.
You want a "class factory". This can either be the esoteric "metaclass"
(using "type"), which one can only understand for moments at a time, or
something more grounded in intuition, or, a combo (for fun). You can
probably tighten this a little, but this is the idea:
def c_factory(cname, pname, num, modulus, default):
def accessorize(prop):
def _get(self):
return getattr(self, prop)
def _set(self, v):
v_new = v % modulus
setattr(self, prop, v_new)
return (_get, _set)
def _init(self):
for i in xrange(num):
setattr(self, '%s%s' % (pname,i), default)
_C = type(cname, (object,), {'__init__':_init})
for i in xrange(num):
prop = '_%s%s' % (pname, i)
setattr(_C, '%s%s' % (pname, i), property(*accessorize(prop)))
return _C
E.g.:
py> def c_factory(cname, pname, num, modulus, default):
... def accessorize(prop):
... def _get(self):
... return getattr(self, prop)
... def _set(self, v):
... v_new = v % modulus
... setattr(self, prop, v_new)
... return (_get, _set)
... def _init(self):
... for i in xrange(num):
... setattr(self, '%s%s' % (pname,i), default)
... _C = type(cname, (object,), {'__init__':_init})
... for i in xrange(num):
... prop = '_%s%s' % (pname, i)
... setattr(_C, '%s%s' % (pname, i), property(*accessorize(prop)))
... return _C
...
py> Bob = c_factory('Bob', 'bob', 4, 256, 128)
py> b = Bob()
py> b.bob0
128
py> b.bob1
128
py> b.bob1 = 258
py> b.bob1
2
py> b.bob3
128
py> dir(b)
['__class__',
'__delattr__',
'__dict__',
'__doc__',
'__getattribute__',
'__hash__',
'__init__',
'__module__',
'__new__',
'__reduce__',
'__reduce_ex__',
'__repr__',
'__setattr__',
'__str__',
'__weakref__',
'_bob0',
'_bob1',
'_bob2',
'_bob3',
'bob0',
'bob1',
'bob2',
'bob3']
py> Bob
<class '__main__.Bob'>
--
James Stroud
UCLA-DOE Institute for Genomics and Proteomics
Box 951570
Los Angeles, CA 90095
http://www.jamesstroud.com/
More information about the Python-list
mailing list