Ответ 1
У Python нет встроенного устройства, но вы можете определить свой собственный:
def setdefaultattr(obj, name, value):
if not hasattr(obj, name):
setattr(obj, name, value)
return getattr(obj, name)
Python setdefault позволяет получить значение из словаря, но если ключ не существует, тогда вы назначаете основанный на параметре default
. Затем вы получаете все, что находится у ключа в словаре.
Без манипулирования объектом __dict__
Есть ли подобная функция для объектов?
например,
У меня есть объект foo
, который может иметь или не иметь атрибут bar
. Как я могу сделать что-то вроде:
result = setdefaultattr(foo,'bar','bah')
У 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(....)
В соответствии с docs, 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__
для предоставления значений по умолчанию. Это путь Pythonic.
class Foo( object ):
def __init__( self ):
self.bar = 'bah'
Это нормальный, стандартный, типичный подход. Там нет веских причин, чтобы сделать иначе.