Bir nesnenin __dict__ değerini, özelliklerini Pythonic olarak ayarlamak üzere değiştirmek mi?


12

Bir veritabanında (veya başka bir kaynak, örneğin MongoDB, CSV dosyası, vb.) Bulunan satırlardan nesneleri şişiren bir sınıf var. Nesnenin özelliklerini ayarlamak için self.__dict__.update(**properties)veya gibi bir şey yapar obj.__dict__.update(**properties).

Bu Pythonic mi? Bu, kullanmaya devam etmem gereken iyi bir model mi, yoksa bu kötü bir form mu?


1
Pythonic olup olmadığını bilmiyorum, ancak dunder init'te yapmak kesinlikle daha yaygın.
user16764

Yanıtlar:


10

Python 3.3'te yeni bir tür eklendi types.SimpleNamespace()ve belgelerde bu şekilde açıklandı:

Tür kabaca aşağıdaki koda eşdeğerdir:

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))

Not __init__tip yöntemi; tekniğin Python belgelerinden daha iyi bir onayını alamazsınız.


SimpleNamespaceSabit bir dizi özelliğe sahip olmaması nedeniyle çoğu türden oldukça farklı olsa da.

7
Python belgelerinden bahsetmek gerekirse, docs.python.org/2/library/stdtypes.html "Her modülün özel bir özelliği __dict__. Bu modülün sembol tablosunu içeren sözlüktür. Bu sözlüğü değiştirmek aslında modülün sembolünü değiştirecek tablo, ancak doğrudan atama __dict__özniteliği mümkün değildir (yazabilir m.__dict__['a'] = 1tanımlar, hangi m.a1 olmak, ama yapamazsın writem.__dict__ = {}). değiştirme __dict__doğrudan tavsiye edilmez ," başlangıçta bu soruyu sormak beni istenir olduğunu hangi.
Ağustos'ta skyler

@skyler: sadece modül ad alanından bahsettiğine dikkat edin . globals()İşlev aynı ad verir ve dolayısıyla dinamik uyarı globals ayarı daha sorunları çözmek için genellikle daha iyi yollar vardır.
Martijn Pieters
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.