我可以添加属性的最常用的python类型是什么?

时间:2010-10-14 13:55:23

标签: python object attributes types

我有一个类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

但这似乎太长了一枪。必须有一些我可以用于此目的的一般类型,但哪个?

3 个答案:

答案 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

依旧......