Pythonで匿名オブジェクトを作成することは可能ですか?


Answers

私はこれを見つけました: http://www.hydrogen18.com/blog/python-anonymous-objects.html : http://www.hydrogen18.com/blog/python-anonymous-objects.htmlそして私の限られたテストでは、うまくいくようです:

>>> obj = type('',(object,),{"foo": 1})()
>>> obj.foo
1
Question

私はいくつかの属性を持つオブジェクトのリストを入力として受け取るPythonをデバッグしています。

私はいくつかのテスト値をハードコーディングしたいと思います - 例えば、 "foo"属性がいくつかの数に設定されている4つのオブジェクトのリストを考えてみましょう。

これよりも簡潔な方法がありますか?

x1.foo = 1
x2.foo = 2
x3.foo = 3
x4.foo = 4
myfunc([x1, x2, x3, x4])

理想的には、私はちょうど次のようなことを言うことができるようにしたいと思います:

myfunc([<foo=1>, <foo=2>, <foo=3>, <foo=4>])

(明らかに、それは作り上げられた構文ですが、実際には同様のことがありますか?)

注:これは決してチェックインされることはありません。これは単なるデバッグコードです。 読みやすさや保守性について心配しないでください。




そのような短い、そのようなPython! Oo

>>> Object = lambda **kwargs: type("Object", (), kwargs)
>>> person = Object(name = "Bernhard", gender = "male", age = 42)
>>> person.name
'Bernhard'
>>>

編集:まあまあ、これは、オブジェクトオブジェクトではなく、クラスオブジェクトを作成します。 しかし、匿名オブジェクトのように扱うこともできますし、すぐにインスタンスを作成するために括弧を追加して最初の行を変更することもできます。

>>> Object = lambda **kwargs: type("Object", (), kwargs)()



多分namedtupleを使って以下のようにこれを解決することができます:

from collections import namedtuple
Mock = namedtuple('Mock', ['foo'])

mock = Mock(foo=1)
mock.foo  // 1



ノー・クラシック:

def mock(**attrs):
    r = lambda:0
    r.__dict__ = attrs
    return r 

def test(a, b, c, d):
    print a.foo, b.foo, c.foo, d.foo

test(*[mock(foo=i) for i in xrange(1,5)])
# or
test(mock(foo=1), mock(foo=2), mock(foo=3), mock(foo=4))





Related