Подтвердить что ты не робот

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

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

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

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

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

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

vars(obj).setdefault(name, value)

Ответ 4

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

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

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

Это нормальный, стандартный, типичный подход. Там нет веских причин, чтобы сделать иначе.