В python существует эквивалент setdefault () для получения атрибутов объекта?

Значение setdefault для Python позволяет получить значение из словаря, но если ключ не существует, вы назначаете значение по default по default . Затем вы выбираете все, что находится в ключе в словаре.

Без манипуляции с объектом __dict__ Есть ли аналогичная функция для объектов?

например
У меня есть объект foo который может иметь или не иметь bar атрибутов. Как я могу сделать что-то вроде:

 result = setdefaultattr(foo,'bar','bah') 

4 Solutions collect form web for “В python существует эквивалент setdefault () для получения атрибутов объекта?”

У Python нет встроенного устройства, но вы можете определить свой собственный:

 def setdefaultattr(obj, name, value): if not hasattr(obj, name): setattr(obj, name, value) return getattr(obj, name) 

Обратите внимание, что принятый в настоящее время ответ будет, если атрибут уже не существует, вызвал hasattr (), setattr () и getattr (). Это было бы необходимо, только если бы ФП делал что-то вроде переопределения setattr и / или getattr – в этом случае OP не является невиновным enquirer, к которому мы его взяли. В противном случае вызов всех 3 функций важен; при вызове setattr () должно следовать return value чтобы оно не попадало, чтобы return getattr(....)

Согласно документам , hasattr () реализуется путем вызова getattr () и исключения catching. Следующий код может быть быстрее, если атрибут уже существует:

 def setdefaultattr(obj, name, value): try: return getattr(obj, name) except AttributeError: setattr(obj, name, value) return value 
 vars(obj).setdefault(name, value) 

Не делай этого.

Пожалуйста.

Используйте __init__ для предоставления значений по умолчанию. Пожалуйста. Это путинский путь.

 class Foo( object ): def __init__( self ): self.bar = 'bah' 

Это обычный, стандартный, типичный подход. Нет никаких оснований для этого.

  • Socket не работает в Python
  • Python: конвертировать строку в упакованный hex ('01020304' -> '\ x01 \ x02 \ x03 \ x04')
  • заменить символы, не работающие в python
  • В чем же разница между мелкой копией, глубокой копией и нормальной работой присваивания?
  • Получить общее количество из списка
  • Как отменить геокодирование серверов с помощью python, json и google maps?
  • Python urllib2: Чтение содержимого тела даже во время исключения HTTPError?
  • Python: TypeError - не все аргументы, преобразованные во время форматирования строки
  • Python - лучший язык программирования в мире.