@Martijnの回答からメタクラス化アプローチを採用する場合、@ Nedの回答は短く書き直すことができます(明らかに読みにくくなりますが、同じことを行います)。
obj = type('Expando', (object,), {})()
obj.foo = 71
obj.bar = 'World'
dict
または、引数を使用して上記と同じことを行います。
obj = type('Expando', (object,), {'foo': 71, 'bar': 'World'})()
bases
Python 3の場合、オブジェクトを引数に渡す必要はありません(type
ドキュメントを参照)。
ただし、単純なケースの場合、インスタンス化にはメリットがないため、次のように実行しても問題ありません。
ns = type('Expando', (object,), {'foo': 71, 'bar': 'World'})
同時に、個人的には、アドホックテスト構成の場合に最も単純で読みやすいプレーンクラス(つまり、インスタンス化なし)を好みます。
class ns:
foo = 71
bar = 'World'
アップデート
Python 3.3以降では、OPが要求するものが正確types.SimpleNamespace
にあります。それはただ:
object
名前空間への属性アクセスと意味のあるreprを提供する単純なサブクラス。
とは異なりobject
、SimpleNamespace
属性を追加および削除できます。SimpleNamespace
オブジェクトがキーワード引数で初期化される場合、それらは基になる名前空間に直接追加されます。
import types
obj = types.SimpleNamespace()
obj.a = 123
print(obj.a) # 123
print(repr(obj)) # namespace(a=123)
ただし、Python2とPython3の両方のstdlibにargparse.Namespace
は、同じ目的を持つがあります。
属性を格納するための単純なオブジェクト。
属性名と値による同等性を実装し、単純な文字列表現を提供します。
import argparse
obj = argparse.Namespace()
obj.a = 123
print(obj.a) # 123
print(repr(obj)) # Namespace(a=123)
どちらもキーワード引数で初期化できることに注意してください。
types.SimpleNamespace(a = 'foo',b = 123)
argparse.Namespace(a = 'foo',b = 123)