创建许多类似的属性 [英] creating many similar properties
问题描述
我理解如何创建这样的属性:
类RC(对象):
def _set_pwm( self,v):
self._pwm01 = v%256
def _get_pwm(个体经营):
返回self._pwm01
pwm01 = property(_get_pwm,_set_pwm)
但是如果我有一大堆这些pwm属性怎么办?
我做了这个:
类RC(对象):
def _makeprop(名称):
prop =''_%s''%name
def _set(self,v):
v_new = v%256
setattr(self,prop,v_new)
def _get(self):
返回getattr(self,prop)
返回属性(_get,_set)
pwm01 = _makeprop(''pwm01'')
pwm02 = _makeprop(''pwm02'')
也不错,除了不得不重复这个名字。
我想要一个pwm名称列表和
让它们都像这样设置。如果
每个人都被设置为默认值127也会很好....
有什么想法吗?
>
感谢您的时间。
Lee Harr写道:
我理解如何创建这样的属性:
类RC(对象):
def _set_pwm(self,v):
self._pwm01 = v%256
def _get_pwm(个体经营):
返回self._pwm01
pwm01 = property(_get_pwm, _set_pwm)
但如果我有一大堆这些pwm属性怎么办?
我做了这个:
>
类RC(对象):
def _makeprop(名称):
prop =''_%s''%name
def _set(self,v):
v_new = v%256
setattr(self,prop,v_new)
def _get(自我):
返回getattr(自我,道具)
返回属性(_get,_set)
pwm01 = _makeprop(''pwm01'')
pwm02 = _makeprop( ''pwm02'')
还不错,除了不得不重复这个名字。
我想要一份清单pwm的名字和
都有这样的设置。如果
每个人都被设置为默认值127也会很好....
有什么想法吗?
>
感谢您的时间。
你想要一个类工厂。这可以是深奥的元类
(使用类型),一次只能理解一次,或者
更多基础的东西直觉,或者,组合(为了好玩)。你可以
可能会收紧一点,但这就是这个想法:
def c_factory(cname,pname,num,modulus,default):
def accessorize(prop):
def _get(self):
返回getattr(self,prop)
def _set(self,v):
v_new = v%模数
setattr(self,prop,v_new)
return(_get,_set)
def _init(self):
$ x $ b for x in xrange(num):
setattr(self,''%s%s''' %(pname,i),默认值)
_C = type(cname,(object,),{''_ _ init __'':_ init})
$ x $ b for x in xrange (num):
prop =''_%s%s''%(pname,i)
setattr(_C,''%s%s''% (pname,i),property(* accessorize(prop)))
返回_C
例如:
pydef c_factory( cname,pname,num,modulus,default):
.... def accessorize(prop):
.... def _get(self):
....返回getattr(self,prop)
.... def _set(sel f,v):
.... v_new = v%模数
.... setattr(self,prop,v_new)
.... return(_get,_set)
.... def _init(self):
.... for x in xrange(num):
.... setattr(self,''%s%s''%(pname,i),默认)
.... _C = type(cname,( object,),{''__ init __'':_ init})
.... for x in xrange(num):
.... prop ='' _%s%s''%(pname,i)
.... setattr(_C,''%s%s''%(pname,i),property(* accessorize(prop) )))
....返回_C
....
pyBob = c_factory(''Bob'',''bob '',4,256,128)
pyb =鲍勃()
pyb.bob0
128
pyb.bob1
128
pyb.bob1 = 258
pyb.bob1
2
pyb.bob3
128
pydir(b)
[''__class__'',
''__ delattr__'',
''__ dict__'',
''__ doc__'',
''__ getattribute__'',
''__ hash__'',
''__ init__' ',
''__ module _'',
''__ new__'',
''__ reduce__'',
''__ reduce_ex__'',
''_ _ rpr__'',
''__ setattr__'',
''_ _ ttr _'',
''__ werefref__'',
''_ bob0'',
''_ bob1'',
''_bob2'',
''_ bob3'',
''bob0'',
''bob1'',
''bob2'',
''bob3'']
pyBob
< class''__ main__。 Bob''>
-
James Stroud
UCLA-DOE基因组学和蛋白质组学研究所
方框951570
洛杉矶,CA 90095
http://www.jamesstroud.com/
在< n2 ***************** @ news01.roc.ny> ;, Lee Harr写道:
但是,如果我有一大堆这些pwm属性怎么办?
我做了这个:
class RC(对象):
def _makeprop(姓名):
prop =''_%s''%name
def _set(self ,v):
v_new = v%256
setattr(self,prop,v_new)
def _get(self):
返回getattr(self,prop)
返回属性(_get,_set)
pwm01 = _makeprop(''pwm01'')
pwm02 = _makeprop(''pwm02'')
还不错,除了不得不重复这个名字。
我想拥有一个pwm名称列表和
让它们都像这样设置。如果
每个人的默认值也设置为127也会很好....
有什么想法吗?
使用`__getattr __()`和`__setattr __()`方法和名称字典
映射到值,另一个映射到值名称为
模数操作的默认值。
Ciao,
Marc''BlackJack''Rintsch
Lee Harr写道:
我理解如何创建这样的属性:
类RC(对象):
def _set_pwm(self,v):
self._pwm01 = v%256
def _get_pwm (个体经营):
返回self._pwm01
pwm01 =属性(_get_pwm,_set_pwm)
但如果我有一个一大堆这些pwm属性?
我做了这个:
类RC(对象):
def _makeprop(name):
prop =''_%s''%name
def _set(self,v):
v_new = v%256
setattr(self,prop,v_new)
def _get(self):
返回getattr(self,prop)
返回属性(_get, _set)
pwm01 = _makeprop(''pwm01'')
pwm02 = _makeprop(''pwm02'')
还不错,除了不得不重复这个名字。
我想要一个pwm名字列表和
有它们所有这些都是这样设置的。如果
每个人都被设置为默认值127也会很好....
有什么想法吗?
是的,这个怎么样?
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):
返回getattr(self,prop,default)
loc [name] = property(_get,_set)
类RC(对象) :
defprop(''pwm01'')
defprop(''pwm02'')
rc = RC()
打印rc.pwm01#127
打印rc.pwm02#127
rc.pwm02 = 1312
print rc.pwm02#32
这有点像hackish,但我更喜欢这个而不是元类
解决方案。因为它不会给你的班级增加任何隐藏的魔法。
Michele Simionato
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.
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.:
pydef 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
....
pyBob = c_factory(''Bob'', ''bob'', 4, 256, 128)
pyb = Bob()
pyb.bob0
128
pyb.bob1
128
pyb.bob1 = 258
pyb.bob1
2
pyb.bob3
128
pydir(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'']
pyBob
<class ''__main__.Bob''>
--
James Stroud
UCLA-DOE Institute for Genomics and Proteomics
Box 951570
Los Angeles, CA 90095
http://www.jamesstroud.com/
In <n2*****************@news01.roc.ny>, Lee Harr wrote:
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?Use `__getattr__()` and `__setattr__()` methods and a dictionary of names
mapped to values and another that maps the names to default values for the
modulo operation.
Ciao,
Marc ''BlackJack'' Rintsch
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
这篇关于创建许多类似的属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!