Наконец мне удалось реализовать классы с помощью свойства (). Большое спасибо за совет. Мне потребовалось немало времени, чтобы разобраться с этим, но я могу обещать, что это упражнение поможет вам лучше понять ООП питонов.
Я также реализовал это с помощью __getattr__ и __setattr__, но все еще не знаю преимуществ и недостатков свойства-решения. Но это, кажется, стоит другого вопроса. Похоже, свойства-решения довольно чистые.
Так вот код:
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(*args):
self = args[0]
print "get(): "
print args
return self._v
def set(*args):
print "set(): "
print args
self = args[0]
value = args[-1]
self._v = value
v = property(fget=get, fset=set, doc='value of parameter')
class Collection(dict):
# inheriting from dict saves the methods: __getitem__ and __init__
def add(self, par):
self[par.name] = par
# Now here comes the tricky part.
# (Note: this property call the get() and set() methods with one
# more argument than the property of SingleParameter)
setattr(Collection, par.name,
property(fget=par.get, fset=par.set))
# Applying the classes:
par1 = SingleParameter(name='par1', default_value=10, unit='mV')
par2 = SingleParameter(name='par2', default_value=20, unit='mA')
col = Collection()
col.add(par1)
col.add(par2)
# Setting parameter values:
par1.v = 13
col.par1 = 14
# Getting parameter values:
par1.v
col.par1
# checking identity:
par1.v is col.par1
# to access the whole object:
col['par1']
Поскольку я новичок, я не уверен, как двигаться дальше:
как относиться к последующим вопросам (как это само по себе):
- get (), кажется, вызывается дважды - почему?
- oop-design: свойство против "__getattr__ & __setattr__" - когда и что мне использовать?
- Грубо ли проверять собственный ответ на свой вопрос как принято ?
- рекомендуется ли переименовать заголовок, чтобы поместить связанные вопросы или вопросы, разработанные на том же примере, в один и тот же контекст?
Другие вопросы, которые я задаю для понимания свойства ():