Apakah memodifikasi objek __dict__ untuk mengatur propertinya dianggap Pythonic?


12

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?


1
Saya tidak tahu apakah itu Pythonic, tetapi tentu saja lebih umum melakukannya di dunder init.
user16764

Jawaban:


10

Dalam Python 3.3, tipe baru ditambahkan types.SimpleNamespace(),, dan dalam dokumentasi itu dijelaskan sebagai berikut:

Jenis ini kira-kira setara dengan kode berikut:

class SimpleNamespace:
    def __init__(self, **kwargs):
        self.__dict__.update(kwargs)
    def __repr__(self):
        keys = sorted(self.__dict__)
        items = ("{}={!r}".format(k, self.__dict__[k]) for k in keys)
        return "{}({})".format(type(self).__name__, ", ".join(items))

Perhatikan __init__metode jenisnya; Anda tidak bisa mendapatkan dukungan teknik yang lebih baik daripada dokumentasi Python.


Meskipun SimpleNamespacesangat berbeda dari kebanyakan tipe dalam hal itu tidak memiliki set atribut yang tetap.

7
Nah, berbicara tentang dokumentasi Python, dari docs.python.org/2/library/stdtypes.html "Atribut khusus setiap modul adalah __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 menulis m.__dict__['a'] = 1, yang mendefinisikan m.amenjadi 1, tetapi Anda tidak bisa writem.__dict__ = {}). Memodifikasi __dict__secara langsung tidak disarankan , "yang pada awalnya mendorong saya untuk menanyakan pertanyaan ini.
skyler

@skyler: perhatikan bahwa itu hanya menyebutkan namespace modul . The globals()mengembalikan fungsi namespace yang sama, dan ada cara biasanya lebih baik untuk memecahkan masalah daripada pengaturan GLOBALS dinamis, maka peringatan.
Martijn Pieters
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.