可以给哪些Python类型添加属性?
我有一个叫 Foo 的类,里面有一个方法叫 isValid。然后我还有一个方法 bar(),它接收一个 Foo 对象,行为会根据这个对象是否有效而有所不同。
为了测试这个,我想传一个对象给 bar,这个对象的 isValid 方法总是返回 False。不过因为其他原因,我在测试时不能创建 Foo 的对象,所以我需要一个可以假装成 Foo 的对象。我最开始想到的是创建一个最通用的对象,然后给它添加一个 isValid 属性,这样就可以当作 Foo 来用。但这样并没有成功:
>>> foo = object()
>>> foo.isValid = lambda : False
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'object' object has no attribute 'isValid'
我发现对象没有 __dict__
属性,所以不能给它添加属性。到这时,我的解决办法是动态创建一个类型,然后用这个类型创建一个对象:
>>> tmptype = type('tmptype', (), {'isValid' : lambda self : False})
>>> x = tmptype()
>>> x.isValid()
False
但这样似乎太复杂了。我想应该有一个现成的通用类型可以用来实现这个目的,但到底是哪一个呢?
3 个回答
1
为什么非得把事情搞得复杂呢?我觉得最简单的方法(也是“标准”的做法)就是这样做:
class FakeFoo(object):
def is_valid():
return False
另外,在这种情况下使用lambda表达式并不好……看看这个链接:
http://python-history.blogspot.com/2009/04/origins-of-pythons-functional-features.html这是由BDFL写的。
还有其他的……
7
你的想法是对的,但可以让它更通用一些。可以用
tmptype = type('tmptype', (object,) {})
或者
class tmptype(object):
pass
然后你可以直接这样做
foo = tmptype()
foo.is_valid = lambda: False
就像你想用object
那样。这样一来,你就可以用同一个类来满足你所有动态修改的需求。
4
为了让大家能直接看到正确的答案,不用去翻阅所有评论:并没有这种类型。 这个想法曾经被提出来讨论过,但最终被否决了。这里有一个链接,是aaronasterling在评论中分享的,大家可以在这里了解更多信息:http://mail.python.org/pipermail/python-bugs-list/2007-January/036866.html