是否有可能在Python中创build匿名对象?

我正在debugging一些Python,它将input一个对象列表,每个对象都有一些属性。

我想硬编码一些testing值 – 比方说,其中“foo”属性设置为某个数字的四个对象的列表。

有没有比这更简洁的方式?

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

(很显然,这是编写的语法,但有没有类似的东西真的起作用?)

注意:这将永远不会被检入。这只是一些一次性的debugging代码。 所以不要担心可读性或可维护性。

我喜欢Tetha的解决scheme,但这不必要的复杂。

这里简单一些:

 >>> class MicroMock(object): ... def __init__(self, **kwargs): ... self.__dict__.update(kwargs) ... >>> def print_foo(x): ... print x.foo ... >>> print_foo(MicroMock(foo=3)) 3 

我发现这个: http : //www.hydrogen18.com/blog/python-anonymous-objects.html ,并在我有限的testing,似乎它的工作原理:

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

看看这个:

 class MiniMock(object): def __new__(cls, **attrs): result = object.__new__(cls) result.__dict__ = attrs return result def print_foo(x): print x.foo print_foo(MiniMock(foo=3)) 

非优雅:

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

另一个明显的黑客:

 class foo1: x=3; y='y' class foo2: y=5; x=6 print(foo1.x, foo2.y) 

但是对于你的确切用例,直接用匿名对象调用一个函数,我不知道任何一行都没有那么冗长

 myfunc(type('', (object,), {'foo': 3},), type('', (object,), {'foo': 4})) 

丑,做这个工作,但不是真的。

这么简单,这样的Python! 吴

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

编辑:好的好吧,从技术上讲,这创build了一个类对象,而不是一个对象对象。 但是你可以把它看成一个匿名对象,或者你可以通过附加一对括号来立即创build一个实例来修改第一行:

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

从Python 3.3开始,就有了types简单的命名空间 ,

 myfunc([types.SimpleNamespace(foo=1), types.SimpleNamespace(foo=2), types.SimpleNamespace(foo=3), types.SimpleNamespace(foo=4)]) 

这有点罗嗦,但你可以用一个别名清理它:

 _ = types.SimpleNamespace myfunc([_(foo=1), _(foo=2), _(foo=3), _(foo=4)]) 

现在,这实际上非常接近您的问题中的虚构语法。