I am programming a simulations for single neurons. Therefore I have to handle a lot of Parameters. Now the Idea is that I have two classes, one for a SingleParameter and a Collection of parameters. I use property() to access the parameter value easy and to make the code more readable. This works perfect for a sinlge parameter but I don’t know how to implement it for the collection as I want to name the property in Collection after the SingleParameter. Here an example:
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
Other questions that I put to understand property():
Using the same get/set functions for both classes forces you into an ugly hack with the argument list. Very sketchy, this is how I would do it:
In class SingleParameter, define get and set as usual:
In class Collection, you cannot know the information until you create the property, so you define the metaset/metaget function and particularize them only later with a lambda function: