При использовании .net необходимо использовать InternalsVisibleToAttribute.
Первый более эффективен, чем второй. del foo.bar
компилируется в две инструкции байт-кода:
2 0 LOAD_FAST 0 (foo)
3 DELETE_ATTR 0 (bar)
тогда как delattr (foo, "bar")
занимает пять:
2 0 LOAD_GLOBAL 0 (delattr)
3 LOAD_FAST 0 (foo)
6 LOAD_CONST 1 ('bar')
9 CALL_FUNCTION 2
12 POP_TOP
Это немного преобразуется в первое выполнение быстрее (но это не большая разница - 0,15 мкс на моей машине).
Как говорили другие, вам действительно следует использовать вторую форму только тогда, когда атрибут, который вы удаляете, определяется динамически.
[Отредактировано, чтобы показать инструкции байт-кода, созданные внутри функции, где компилятор может использовать LOAD_FAST
и LOAD_GLOBAL
]
Несомненно первое. На мой взгляд, это все равно, что спросить, лучше ли foo.bar
, чем getattr (foo, «bar»)
, и я не думаю, что кто-то задает этот вопрос :)
Это действительно вопрос предпочтений, но первое, вероятно, предпочтительнее. Я бы использовал второй, только если вы заранее не знаете имя удаляемого атрибута.
Как и getattr и setattr, delattr следует использовать только тогда, когда имя атрибута неизвестно.
В этом смысле он примерно эквивалентен нескольким функциям Python, которые используются для доступа к встроенным функциональность на более низком уровне, чем обычно, например __ import __
вместо import
и operator.add
вместо +
Не уверен насчет внутренней работы, но с точки зрения возможности многократного использования кода и не быть придурком с точки зрения коллеги, используйте del. Это более понятно и понятно людям, говорящим на других языках.
Если вы думаете, что delattr
более явный, то почему бы не использовать все время getattr
, а не object.attr
?
Что до того, что скрывается под капотом ... ваше предположение не хуже моего. Если не значительно лучше.