Вы можете уменьшить количество просмотров в предположении, что расстояние A-> B - это то же самое, что B-> A, и не делать циклов A-> A. Это означает, что для 15 локаций вы можете уйти с 15 * 14/2 = 105. Это все еще довольно много, но меньше половины, чем раньше.
Используя то же получают/функции множества для обеих сил классов Вас в ужасный взлом со списком аргументов. Очень поверхностный, это - то, как я сделал бы это:
В классе SingleParameter определите, получают и устанавливают, как обычно:
def get(self):
return self._s
def set(self, value):
self._s = value
В классе Набор Вы не можете знать информацию, пока Вы не создаете свойство, таким образом, Вы определяете метаустановить/метаполучить функцию и конкретизируете их только позже с функцией лямбды:
def metaget(self, par):
return par.s
def metaset(self, value, par):
par.s = value
def add(self, par):
self[par.name] = par
setattr(Collection, par.name,
property(
fget=lambda x : Collection.metaget(x, par),
fset=lambda x, y : Collection.metaset(x,y, par))
Взгляд на встроенные функции getattr
и setattr
. Вы, вероятно, будете намного более счастливыми.
Свойства предназначены, чтобы динамично оценить атрибуты или сделать их только для чтения. То, в чем Вы нуждаетесь, настраивает доступ атрибута. __getattr__
и __setattr__
сделайте это действительно прекрасное, и существует также __getattribute__
если __getattr__
недостаточно.
См. документы Python о настройке доступа атрибута для деталей.
Вы посмотрели на пакет черт? Кажется, что Вы изобретаете велосипед здесь с Вашими классами параметра. Черты также имеют дополнительные функции, которые могли бы быть полезны для Вашего типа приложения (инцидентным образом, я знаю человека, который счастливо использует черты на нейронных моделированиях).
Теперь я реализовал решение с set-/getattr:
class Collection(object):
...
def __setattr__(self, name, value):
if 'dict' in self.__dict__:
if name in self.dict:
self[name].v = value
else:
self.__dict__[name] = value
def __getattr__(self, name):
return self[name].v
Существует одна вещь, мне вполне не нравится так много: атрибуты не находятся в __ dict __. И если бы у меня есть они там также, у меня была бы копия значения - который может быть опасным...
Наконец я успешно выполнился для реализации классов со свойством (). Большое спасибо за совет. Это взяло меня вполне немного для разработки его - но я могу обещать Вам, что это осуществление помогает Вам понять лучшее ООП Python.
Я реализовал его также с __ 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']
Поскольку я являюсь новым, я не уверен, как идти дальше: как рассматривать, развивают вопросы (как это само):
Другие вопросы, которые я поместил для понимания свойства ():