是否有可能在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)])
现在,这实际上非常接近您的问题中的虚构语法。