如何使用动态名称实现 property() (在 python 中)

2024-04-13

我正在对单个神经元进行模拟编程。因此我必须处理很多参数。现在的想法是我有两个类,一个用于 SingleParameter,一个用于参数集合。我使用 property() 来轻松访问参数值并使代码更具可读性。这非常适合 sinlge 参数,但我不知道如何为集合实现它,因为我想在 SingleParameter 之后命名 Collection 中的属性。这里有一个例子:

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() 提出的其他问题:

  • 为什么托管属性只适用于类属性而不适用于 python 中的实例属性? https://stackoverflow.com/questions/428264
  • 如何通过 python 中的 __dict__ 分配新的类属性? https://stackoverflow.com/questions/432786/

查看内置函数getattr and setattr。你可能会快乐很多。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用动态名称实现 property() (在 python 中) 的相关文章

随机推荐