Это может быть глупо, но какое-то время болит затылок.
Python предоставляет нам два встроенных способа удаления атрибутов из объектов, слово команды del и встроенную функцию delattr . Я предпочитаю delattr, потому что я думаю, что это немного более явно:
del foo.bar
delattr(foo, "bar")
Но мне интересно, могут ли быть скрытые различия между ними.
dis
Модуль. Вы можете запустить его из командной строки, используяpython -m dis
и введя некоторый код, или разобрать функцию с помощьюdis.dis()
.Рассмотрим следующие примеры:
или:
Вы не можете сделать это с дель .
источник
del self.__dict__[name]
Если предположить, что с мета-классом, конечно, нет ничего смешногоНесомненно бывший. На мой взгляд, это все равно что спрашивать,
foo.bar
лучше лиgetattr(foo, "bar")
, и я не думаю, что кто-то задает этот вопрос :)источник
if hasattr(obj, 'var') and obj.var == ...
... Я мог бы просто уменьшить это до,if getattr(obj, 'var', None) == ...
в большинстве случаев! Думаю, немного короче и проще для чтения.hasattr
фактически звонитgetattr
Это действительно вопрос предпочтений, но первый, вероятно, предпочтительнее. Я бы использовал второй, только если вы не знаете название атрибута, который вы удаляете заранее.
источник
Как и getattr и setattr, delattr следует использовать только тогда, когда имя атрибута неизвестно.
В этом смысле он примерно эквивалентен нескольким функциям Python, которые используются для доступа к встроенным функциям на более низком уровне, чем у вас обычно есть, например
__import__
вместоimport
илиoperator.add
вместо+
источник
Не уверен насчет внутренней работы, но с точки зрения повторного использования кода и не будь мудрым коллегой, используйте del. Это понятнее и понятнее людям с других языков.
источник
Если вы думаете, что
delattr
более четко, то почему бы не использоватьgetattr
все время, а неobject.attr
?Что касается под капотом ... Ваше предположение так же хорошо, как мое. Если не значительно лучше.
источник
Это старый вопрос, но я бы хотел поставить свои 2 цента.
Хотя,
del foo.bar
изящнее, порой понадобитсяdelattr(foo, "bar")
. Скажем, если у вас есть интерактивный интерфейс командной строки, который позволяет пользователю динамически удалять любой элемент в объекте, вводя имя , то у вас нет другого выбора, кроме как использовать последнюю форму.источник