В Python, там setdefault () эквивалентный для получения атрибутов объектов?

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

Не управляя объектом __dict__Существует ли подобная функция для объектов?

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

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

14
задан Ross Rogers 21 October 2019 в 02:36
поделиться

4 ответа

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

def setdefaultattr(obj, name, value):
    if not hasattr(obj, name):
        setattr(obj, name, value)
    return getattr(obj, name)
7
ответ дан 1 December 2019 в 08:52
поделиться

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

Используйте __ init __ , чтобы указать значения по умолчанию. Это питонический путь.

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

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

-2
ответ дан 1 December 2019 в 08:52
поделиться

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

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

def setdefaultattr(obj, name, value):
    try:
        return getattr(obj, name)
    except AttributeError:
        setattr(obj, name, value)
    return value
24
ответ дан 1 December 2019 в 08:52
поделиться
vars(obj).setdefault(name, value)
2
ответ дан 1 December 2019 в 08:52
поделиться
Другие вопросы по тегам:

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