To może być głupie, ale od jakiegoś czasu męczy mnie tył mózgu.
Python daje nam dwa wbudowane sposoby usuwania atrybutów z obiektów, słowo polecenia del i funkcję wbudowaną delattr . Wolę delattr, ponieważ wydaje mi się, że jest nieco bardziej wyraźny:
del foo.bar
delattr(foo, "bar")
Ale zastanawiam się, czy mogą istnieć między nimi ukryte różnice.
dis
Moduł. Możesz go uruchomić z linii poleceń używającpython -m dis
i wpisując jakiś kod lub zdemontować funkcję za pomocądis.dis()
.Rozważ następujące przykłady:
lub:
Nie możesz tego zrobić z del .
źródło
del self.__dict__[name]
, zakładając oczywiście, że z klasą meta nie dzieje się żaden śmieszny interesBezsprzecznie ten pierwszy. Moim zdaniem to tak, jakby pytać, czy
foo.bar
jest lepsze niżgetattr(foo, "bar")
, i nie sądzę, żeby ktokolwiek zadawał to pytanie :)źródło
if hasattr(obj, 'var') and obj.var == ...
...if getattr(obj, 'var', None) == ...
W większości przypadków mogłem to po prostu zredukować ! Myślę, że trochę krótszy i łatwiejszy do odczytania.hasattr
faktycznie dzwonigetattr
To naprawdę kwestia preferencji, ale pierwsza jest prawdopodobnie lepsza. Drugiego użyłbym tylko wtedy, gdy nie znasz nazwy atrybutu, który usuwasz z wyprzedzeniem.
źródło
Podobnie jak getattr i setattr, delattr powinien być używany tylko wtedy, gdy nazwa atrybutu jest nieznana.
W tym sensie jest to z grubsza odpowiednik kilku funkcji Pythona, które są używane do uzyskiwania dostępu do wbudowanych funkcji na niższym poziomie niż zwykle dostępne, na przykład
__import__
zamiastimport
ioperator.add
zamiast+
źródło
Nie jestem pewien co do wewnętrznego działania, ale z perspektywy ponownego wykorzystania kodu i nie bądź głupim współpracownikiem, użyj del. Jest to bardziej jasne i zrozumiałe również dla osób pochodzących z innych języków.
źródło
Jeśli uważasz, że
delattr
jest bardziej wyraźny, dlaczego nie używać go przezgetattr
cały czas, a nieobject.attr
?Co do miejsca pod maską ... Twoje przypuszczenia są równie dobre jak moje. Jeśli nie znacznie lepiej.
źródło
To stare pytanie, ale chciałbym włożyć swoje 2 centy.
Chociaż
del foo.bar
jest bardziej elegancki, czasami będziesz potrzebowaćdelattr(foo, "bar")
. Powiedzmy, że jeśli masz interaktywny interfejs wiersza poleceń, który umożliwia użytkownikowi dynamiczne usuwanie dowolnego elementu w obiekcie przez wpisanie jego nazwy , nie masz innego wyboru, jak tylko użyć tej drugiej formy.źródło