Как реализовать свойство () с динамическим именем (в Python)

Вы можете уменьшить количество просмотров в предположении, что расстояние A-> B - это то же самое, что B-> A, и не делать циклов A-> A. Это означает, что для 15 локаций вы можете уйти с 15 * 14/2 = 105. Это все еще довольно много, но меньше половины, чем раньше.

9
задан Community 23 May 2017 в 12:18
поделиться

6 ответов

Используя то же получают/функции множества для обеих сил классов Вас в ужасный взлом со списком аргументов. Очень поверхностный, это - то, как я сделал бы это:

В классе 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))
7
ответ дан 4 December 2019 в 08:02
поделиться

Взгляд на встроенные функции getattr и setattr. Вы, вероятно, будете намного более счастливыми.

10
ответ дан 4 December 2019 в 08:02
поделиться

Свойства предназначены, чтобы динамично оценить атрибуты или сделать их только для чтения. То, в чем Вы нуждаетесь, настраивает доступ атрибута. __getattr__ и __setattr__ сделайте это действительно прекрасное, и существует также __getattribute__ если __getattr__ недостаточно.

См. документы Python о настройке доступа атрибута для деталей.

5
ответ дан 4 December 2019 в 08:02
поделиться

Вы посмотрели на пакет черт? Кажется, что Вы изобретаете велосипед здесь с Вашими классами параметра. Черты также имеют дополнительные функции, которые могли бы быть полезны для Вашего типа приложения (инцидентным образом, я знаю человека, который счастливо использует черты на нейронных моделированиях).

3
ответ дан 4 December 2019 в 08:02
поделиться

Теперь я реализовал решение с 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 __. И если бы у меня есть они там также, у меня была бы копия значения - который может быть опасным...

2
ответ дан 4 December 2019 в 08:02
поделиться

Наконец я успешно выполнился для реализации классов со свойством (). Большое спасибо за совет. Это взяло меня вполне немного для разработки его - но я могу обещать Вам, что это осуществление помогает Вам понять лучшее ООП 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']

Поскольку я являюсь новым, я не уверен, как идти дальше: как рассматривать, развивают вопросы (как это само):

  • доберитесь (), кажется, называют дважды - почему?
  • дизайн ООП: свойство по сравнению с "__ getattr __ и __ setattr __" - когда я должен использовать что?
  • действительно ли грубо проверить собственный ответ на собственный вопрос, как принято?
  • рекомендуется переименовать заголовок для помещения коррелированых вопросов или вопросов, разработанных с тем же примером в тот же контекст?

Другие вопросы, которые я поместил для понимания свойства ():

0
ответ дан 4 December 2019 в 08:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: