У меня есть класс, назовем его 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', '[email protected])
Я хотел бы иметь возможность расширить функцию обновления, чтобы я мог обновлять любые атрибуты класса.
Вы можете просто использовать атрибут __dict__
для прямого изменения значений. Это как словарь, и если вы обновите его, атрибуты объекта будут обновлены.
У вас есть много вариантов. Некоторые из них включают использование 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
лучше, но имя атрибута статичное.
Отличное объяснение большое спасибо.....
Есть
setattr
: docs.python.org/3/library/functions.html#setattr