Ini mungkin konyol, tetapi sudah mengganggu bagian belakang otak saya untuk sementara waktu.
Python memberi kita dua cara bawaan untuk menghapus atribut dari objek, kata perintah del dan fungsi bawaan delattr . Saya lebih suka delattr karena menurut saya ini sedikit lebih eksplisit:
del foo.bar
delattr(foo, "bar")
Tapi saya bertanya-tanya apakah mungkin ada perbedaan di antara mereka.
dis
modul. Anda dapat menjalankannya dari baris perintah menggunakanpython -m dis
dan mengetik beberapa kode, atau membongkar suatu fungsi dengandis.dis()
.Perhatikan contoh-contoh berikut:
atau:
Anda tidak dapat melakukannya dengan del .
sumber
del self.__dict__[name]
, dengan asumsi tentu saja tidak ada bisnis lucu yang terjadi dengan kelas metaTidak diragukan lagi yang pertama. Dalam pandangan saya ini seperti menanyakan apakah
foo.bar
lebih baik daripadagetattr(foo, "bar")
, dan saya tidak berpikir ada orang yang menanyakan pertanyaan itu :)sumber
if hasattr(obj, 'var') and obj.var == ...
... Saya hanya bisa mengurangi ini,if getattr(obj, 'var', None) == ...
dalam banyak kasus! Agak lebih pendek dan lebih mudah dibaca, saya pikir.hasattr
sebenarnya menelepongetattr
Ini benar-benar masalah preferensi, tetapi yang pertama mungkin lebih disukai. Saya hanya akan menggunakan yang kedua jika Anda tidak tahu nama atribut yang Anda hapus sebelumnya.
sumber
Sama seperti getattr dan setattr, delattr hanya boleh digunakan ketika nama atribut tidak dikenal.
Dalam hal itu, ini kira-kira setara dengan beberapa fitur python yang digunakan untuk mengakses fungsi bawaan pada tingkat yang lebih rendah dari yang biasanya Anda miliki, seperti
__import__
bukannyaimport
danoperator.add
bukannya+
sumber
Tidak yakin tentang cara kerja bagian dalam, tetapi dari penggunaan kembali kode dan jangan menjadi rekan kerja yang brengsek, gunakan del. Ini lebih jelas dan dipahami oleh orang-orang yang datang dari bahasa lain juga.
sumber
Jika menurut Anda
delattr
lebih eksplisit, mengapa tidak digunakangetattr
sepanjang waktuobject.attr
?Adapun di bawah tenda ... tebakanmu sama baiknya dengan tebakanku. Jika tidak jauh lebih baik.
sumber
Ini adalah pertanyaan lama, tetapi saya ingin memasukkan 2 sen saya.
Padahal,
del foo.bar
lebih elegan, kadang-kadang Anda butuhkandelattr(foo, "bar")
. Katakanlah, jika Anda memiliki antarmuka baris perintah interaktif yang memungkinkan pengguna untuk secara dinamis menghapus anggota di objek dengan mengetikkan namanya , maka Anda tidak punya pilihan selain menggunakan formulir yang terakhir.sumber