92196


Pythonの標準機能で、任意の名前で、プロパティを設定できる仕組みを教えていただけないでしょうか。  
以下のような事をしたいのですが、独自にクラスを作成しなければならないものなのでしょうか？  
他によいスマートな方法を知りたいです。

[code]

    class MyObject():  # ←わざわざ独自にクラスを作成しないで、dictのように自由にプロパティを設定したい。
        pass
    
    obj = MyObject()
    obj.x = 'AA'
    obj.y = 'BB'
    obj.z = 'CC'
    
    print(obj.x, obj.y, obj.z)
    
[/code]

dictでは、プロパティの指定に鍵カッコで囲む必要がある。  
namedtupleでは、設定可能なプロパティをあらかじめ指定しなければならない。


CC BY-SA 4.0
2022-11-13T03:35:42.917
92192
2022-11-13T14:35:10.993
2022-11-13T14:35:10.993
35267
35267
question
python python3
Pythonの標準機能で、自由にプロパティを設定できるオブジェクトは？


[`class type(name, bases, dict,
**kwds)`](https://docs.python.org/ja/3/library/functions.html?highlight=type#type)
とか

[code]

    IPython 7.31.1 -- An enhanced Interactive Python. Type '?' for help.
    
    In [1]: X = type('X', (), dict(x='A', y='B', z='C'))
    
    In [2]: X
    Out[2]: __main__.X
    
    In [3]: X.x, X.y, X.z
    Out[3]: ('A', 'B', 'C')
    
    In [4]: obj = X()
    
    In [5]: [a for a in dir(obj) if not a.startswith('_')]
    Out[5]: ['x', 'y', 'z']
    
    In [6]: {a: getattr(obj, a) for a in dir(obj) if not a.startswith('_')}
    Out[6]: {'x': 'A', 'y': 'B', 'z': 'C'}
    
    In [7]:
    
[/code]

他に,  
組み込み関数ではないけど `argparse` の
[`Namespace`](https://docs.python.org/ja/3/library/argparse.html?highlight=argparse#argparse.Namespace)
とか

[code]

    In [7]: from argparse import Namespace
    
    In [8]: o = Namespace(bar='BAR', foo=True)
    
    In [9]: o.bar
    Out[9]: 'BAR'
    
    In [10]: o
    Out[10]: Namespace(bar='BAR', foo=True)
    
    In [11]:
    
[/code]


CC BY-SA 4.0
2022-11-13T04:38:36.943
92195
2022-11-13T04:38:36.943
43025
92192
answer


[`types.SimpleNamespace`](https://docs.python.org/ja/3/library/types.html#additional-
utility-classes-and-functions) が有ります。

[code]

    import types
    
    obj = types.SimpleNamespace()
    obj.x = 'AA'
    obj.y = 'BB'
    obj.z = 'CC'
    
    print(obj.x, obj.y, obj.z)  # AA BB CC
    
[/code]

* * *

頭の体操としては、下のようにすれば、クラス定義せずに（作成はするが変数に束縛はしない）1行で独自クラスのオブジェクトを生成できます。

[code]

    obj = type("NameSpace", (object,), {})()
    
[/code]


CC BY-SA 4.0
2022-11-13T04:38:40.050
92196
2022-11-13T04:38:40.050
3054
92192
answer