我有一个类Foo,方法是isValid。然后我有一个方法bar()接收一个Foo对象,其行为取决于它是否有效。
为了测试这个,我想将一些对象传递给bar,其isValid方法总是返回False。由于其他原因,我无法在测试时创建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
但这似乎太长了一枪。必须有一些我可以用于此目的的一般类型,但哪个?
答案 0 :(得分:6)
你有正确的想法,但你可以使它更通用。
tmptype = type('tmptype', (object,) {})
或
class tmptype(object):
pass
然后你可以做
foo = tmptype()
foo.is_valid = lambda: False
就像你想要object
一样。这样,您可以使用相同的类来满足您的所有动态,monky-patching需求。
答案 1 :(得分:4)
正确答案已经陈述,人们不必阅读所有评论:没有这样的类型。已经提出,讨论过,这个想法已被拒绝。以下是aaronasterling在评论中发布的链接,其中可以阅读更多内容:http://mail.python.org/pipermail/python-bugs-list/2007-January/036866.html
答案 2 :(得分:1)
为什么你必须让它变得复杂?我认为最简单的方法(以及“标准”方式)是
class FakeFoo(object):
def is_valid():
return False
此外,在这种情况下使用lambda并不好......看看这个: http://python-history.blogspot.com/2009/04/origins-of-pythons-functional-features.html 是由BDFL
依旧......