创建许多类似的属性 [英] creating many similar properties

查看:81
本文介绍了创建许多类似的属性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



我理解如何创建这样的属性:


类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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆