103

Python で空のオブジェクトを定義するためのショートカットはありますか?それともカスタムの空のクラスのインスタンスを常に作成する必要がありますか?

編集:ダックタイピングに使用できる空のオブジェクトを意味します。

4

10 に答える 10

120

type を使用して、その場で新しいクラスを作成し、インスタンス化できます。そのようです:

>>> t = type('test', (object,), {})()
>>> t
<__main__.test at 0xb615930c>

タイプする引数は、クラス名、基本クラスのタプル、およびオブジェクトの辞書です。関数 (オブジェクトのメソッド) または属性を含めることができます。

実際に最初の行を次のように短縮できます

>>> t = type('test', (), {})()
>>> t.__class__.__bases__
(object,)

デフォルトでは、 type は object から継承する新しいスタイル クラスを作成するためです。

typePython でメタプログラミングに使用されます。

ただし、オブジェクトのインスタンスを作成したいだけの場合。次に、そのインスタンスを作成します。lejlot が示唆するように。

このような新しいクラスのインスタンスを作成することには、役立つ可能性がある重要な違いがあります。

>>> a = object()
>>> a.whoops = 1
Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
AttributeError: 'object' object has no attribute 'whoops'

一方:

>>> b = type('', (), {})()
>>> b.this_works = 'cool'
>>> 
于 2013-10-20T11:30:41.473 に答える
13

あなたは質問でそれを言いましたが、コードでそれを言及した答えがないので、これはおそらく最もクリーンな解決策の1つです:

class Myobject:
    pass

x = Myobject()
x.test = "Hello, world!"  # working

于 2020-04-13T15:58:37.670 に答える
11

「空のオブジェクト」とはどういう意味ですか? クラスのインスタンスobject? あなたは単に実行することができます

a = object()

それとも、null 参照への初期化を意味しますか? 次に、使用できます

a = None
于 2013-10-20T11:29:50.947 に答える
4

使用できます

x = lambda: [p for p in x.__dict__.keys()]

それで

x.p1 = 2
x.p2 = "Another property"

x()
# gives
# ['p1', 'p2']

[(p, getattr(x,p)) for p in x()]
# gives
# [('p1', 2), ('p2', 'Another property')]
于 2020-09-23T10:35:58.563 に答える