Esto puede ser tonto, pero ha estado molestando la parte posterior de mi cerebro por un tiempo.
Python nos brinda dos formas integradas de eliminar atributos de los objetos, la palabra del comando del y la función integrada delattr . Prefiero delattr porque creo que es un poco más explícito:
del foo.bar
delattr(foo, "bar")
Pero me pregunto si podría haber diferencias ocultas entre ellos.
dis
modulo. Puede ejecutarlo desde la línea de comandos usandopython -m dis
y escribiendo algún código, o desmontar una función condis.dis()
.Considere los siguientes ejemplos:
o:
No puedes hacerlo con del .
fuente
del self.__dict__[name]
, suponiendo, por supuesto, que no haya asuntos divertidos con laSin lugar a dudas el primero. En mi opinión, esto es como preguntar si
foo.bar
es mejor quegetattr(foo, "bar")
, y no creo que nadie haga esa pregunta :)fuente
if hasattr(obj, 'var') and obj.var == ...
... ¡podría reducir esto a,if getattr(obj, 'var', None) == ...
en la mayoría de los casos! Un poco más corto y más fácil de leer, creo.hasattr
realidad llamagetattr
Es realmente una cuestión de preferencia, pero la primera es probablemente preferible. Solo usaría el segundo si no conoce el nombre del atributo que está eliminando antes de tiempo.
fuente
Al igual que getattr y setattr, delattr solo debe usarse cuando se desconoce el nombre del atributo.
En ese sentido, es más o menos equivalente a varias características de Python que se utilizan para acceder a la funcionalidad integrada en un nivel inferior al que normalmente tiene disponible, como en
__import__
lugar deimport
y enoperator.add
lugar de+
fuente
No estoy seguro sobre el funcionamiento interno, pero desde una reutilización de código y no sea una perspectiva de compañero de trabajo, use del. También es más claro y entendido por personas que vienen de otros idiomas.
fuente
Si crees que
delattr
es más explícito, ¿por qué no usarlogetattr
todo el tiempo en lugar de hacerloobject.attr
?En cuanto a debajo del capó ... su suposición es tan buena como la mía. Si no significativamente mejor.
fuente
Es una vieja pregunta, pero me gustaría poner mis 2 centavos.
Sin embargo,
del foo.bar
es más elegante, a veces lo necesitarásdelattr(foo, "bar")
. Supongamos que si tiene una interfaz de línea de comandos interactiva que permite a un usuario eliminar dinámicamente cualquier miembro del objeto escribiendo el nombre , entonces no tiene más remedio que usar el último formulario.fuente