Saya memiliki kelas yang mengembang objek dari baris yang ditemukan di database (atau sumber lain, misalnya MongoDB, file CSV, dll.). Untuk mengatur properti objek, ia melakukan sesuatu seperti self.__dict__.update(**properties)
atau obj.__dict__.update(**properties)
.
Apakah ini dianggap Pythonic? Apakah ini pola yang baik yang harus saya terus gunakan, atau ini dianggap bentuk yang buruk?
Jawaban:
Dalam Python 3.3, tipe baru ditambahkan
types.SimpleNamespace()
,, dan dalam dokumentasi itu dijelaskan sebagai berikut:Perhatikan
__init__
metode jenisnya; Anda tidak bisa mendapatkan dukungan teknik yang lebih baik daripada dokumentasi Python.sumber
SimpleNamespace
sangat berbeda dari kebanyakan tipe dalam hal itu tidak memiliki set atribut yang tetap.__dict__
. Ini adalah kamus yang berisi tabel simbol modul. Memodifikasi kamus ini sebenarnya akan mengubah simbol modul tabel, tetapi penugasan langsung ke__dict__
atribut tidak mungkin (Anda dapat menulism.__dict__['a'] = 1
, yang mendefinisikanm.a
menjadi 1, tetapi Anda tidak bisawritem.__dict__ = {}
). Memodifikasi__dict__
secara langsung tidak disarankan , "yang pada awalnya mendorong saya untuk menanyakan pertanyaan ini.globals()
mengembalikan fungsi namespace yang sama, dan ada cara biasanya lebih baik untuk memecahkan masalah daripada pengaturan GLOBALS dinamis, maka peringatan.