我正在编写单个神经元的模拟程序,因此必须处理大量参数。现在的想法是,我有两个类,一个用于单个参数,一个用于参数集合。我使用property()轻松访问参数值并使代码更易读。这对于单个参数非常完美,但我不知道如何为集合实现它,因为我希望在Collection中根据SingleParameter命名属性。下面是一个例子:
class SingleParameter(object):
def __init__(self, name, default_value=0, unit='not specified'):
self.name = name
self.default_value = default_value
self.unit = unit
self.set(default_value)
def get(self):
return self._v
def set(self, value):
self._v = value
v = property(fget=get, fset=set, doc='value of parameter')
par1 = SingleParameter(name='par1', default_value=10, unit='mV')
par2 = SingleParameter(name='par2', default_value=20, unit='mA')
# par1 and par2 I can access perfectly via 'p1.v = ...'
# or get its value with 'p1.v'
class Collection(object):
def __init__(self):
self.dict = {}
def __getitem__(self, name):
return self.dict[name] # get the whole object
# to get the value instead:
# return self.dict[name].v
def add(self, parameter):
self.dict[parameter.name] = parameter
# now comes the part that I don't know how to implement with property():
# It shoule be something like
# self.__dict__[parameter.name] = property(...) ?
col = Collection()
col.add(par1)
col.add(par2)
col['par1'] # gives the whole object
# Now here is what I would like to get:
# col.par1 -> should result like col['par1'].v
# col.par1 = 5 -> should result like col['par1'].v = 5
我想了解有关property()的其他问题:
当我添加以下代码时:
def setattr(self, name, value): self.dict[name] = value
我会收到错误消息:“'Collection'对象没有属性'dict'”,尽管它在__init__中实现了。 - Philipp der Rautenberg