オブジェクトの__dict__を変更して、プロパティをPythonicと見なしますか?


12

データベース(またはMongoDB、CSVファイルなどの別のソース)で見つかった行からオブジェクトを膨らませるクラスがあります。オブジェクトのプロパティを設定するには、self.__dict__.update(**properties)またはのようなことをしますobj.__dict__.update(**properties)

これはPythonicと見なされますか?これは私が使い続けるべき良いパターンですか、それとも悪い形と考えられますか?


1
Pythonicかどうかはわかりませんが、dunder initで行う方が確かに一般的です。
user16764

回答:


10

Python 3.3では、新しいタイプが追加されtypes.SimpleNamespace()ました。ドキュメントでは次のように説明されています。

この型は、次のコードとほぼ同等です。

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

__init__タイプのメソッドに注意してください。Pythonのドキュメントよりも優れた手法の裏付けを得ることはできません。


けれどもがSimpleNamespace、それは、属性の固定セットを持っていないという点で、ほとんどの種類とは全く異なります。

7
Pythonドキュメントについては、docs.python.org / 2 / library / stdtypes.htmlから「すべてのモジュールの特別な属性__dict__は、これはモジュールのシンボルテーブルを含む辞書です。この辞書を変更すると、実際にはモジュールのシンボルが変更されますが、__dict__属性に直接割り当てることはできません(1 m.__dict__['a'] = 1と定義m.aするを書くことはできますが、できませんwritem.__dict__ = {})。直接変更__dict__することはお勧めしません
スカイラー

@skyler:モジュール名前空間のみに言及していることに注意してください。このglobals()関数は同じ名前空間を返しますが、通常、グローバルを動的に設定するよりも問題を解決する方法が優れているため、警告が表示されます。
マーティンピーターズ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.