Вложенные функции Python внутри класса, которые обновляют экземпляр класса

У меня есть класс, назовем его EmployeeProfile. Это собирает кучу данных о человеке.

Я хотел бы иметь возможность обновлять определенные данные в классе с помощью функции.

class EmployeeProfile:
def __init__(self, profile):
    self.displayname = profile.get('displayName')
    self.email = profile.get('email')
    self.firstname = profile.get('firstName')
    self.surname = profile.get('surname')
    self.fullname = profile.get('fullName')
    self.costcode = profile.get('work').get('custom')

def update(self, operation, value):

    def manageremail(value):
        self.manageremail = value

    def costline(value):
        self.costline = value

Есть ли способ использовать одну функцию обновления, чтобы указать, какой атрибут следует обновить, и запустить соответствующую вложенную функцию?

class Ted()
Ted.update('manageremail', 'noreply@me.com)

Я хотел бы иметь возможность расширить функцию обновления, чтобы я мог обновлять любые атрибуты класса.

Есть setattr: docs.python.org/3/library/functions.html#setattr

Stef 17.05.2022 15:07

Вы можете просто использовать атрибут __dict__ для прямого изменения значений. Это как словарь, и если вы обновите его, атрибуты объекта будут обновлены.

Ξένη Γήινος 17.05.2022 15:16
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
2
27
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У вас есть много вариантов. Некоторые из них включают использование setattr(), обновление __dict__ или использование пользовательского словаря:

class EmployeeProfile:
  ATTRIBUTES = {"email", "displayname"}
  def __init__(self, profile):
    self.displayname = profile.get('displayName')
    self.email = profile.get('email')
    ...
  def update(self, attribute, value):
      if attribute not in self.ATTRIBUTES:
          raise ValueError(f"Invalid attribute {attribute!r}")
      setattr(self, attribute, value)

employee = EmployeeProfile({})

# All of these are practically equivalent
employee.update("email", "stuff@stuff")
employee.__dict__["email"] = "stuff@stuff2"
setattr(employee, "email", "stuff@stuff3")  # <--- Personally I'd choose this.
employee.email = "stuff@stuff4"  # <---- Or this.

Некоторые случайные моменты:

  • Пользовательская функция update() позволяет вам устанавливать определенные атрибуты которые обновляются, а остальные нет, или выполняют более сложную логику без использования @property.

  • setattr очень прост и хорошо сочетается с @property позже, если вам понадобится.

  • Использование __dict__.update() позволяет обновлять сразу несколько значений, то есть employee.update({"email": "rawr@rawr", "displayname": "John"}), но не позволяет использовать декораторы свойств.

  • .email лучше, но имя атрибута статичное.

Отличное объяснение большое спасибо.....

blupacetek 17.05.2022 16:10

Другие вопросы по теме