代码之家  ›  专栏  ›  技术社区  ›  ricab

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

  •  6
  • ricab  · 技术社区  · 13 年前

    我有一个方法有效的类foo。然后我有一个方法栏(),它接收一个foo对象,其行为取决于它是否有效。

    为了测试这个,我想将一些对象传递给bar,其isvalid方法返回的总是false。由于其他原因,我不能在测试时创建foo的对象,所以我需要一个对象来伪造它。我首先想到的是创建最普通的对象,并添加属性对它是有效的,因为将它用作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 回复  |  直到 13 年前
        1
  •  6
  •   aaronasterling    13 年前

    你有正确的想法,但你可以使它更一般。要么

     tmptype = type('tmptype', (object,) {})
    

     class tmptype(object):
         pass
    

    那你就做吧

    foo = tmptype()
    foo.is_valid = lambda: False
    

    就像你想做的那样 object . 这样,您就可以使用同一个类来满足您所有的动态、杂乱的补丁需求。

        2
  •  4
  •   ricab    13 年前

    这样人们就不必阅读所有的评论: 没有这种类型。 它已经被提出,讨论,并且这个想法被拒绝了。以下是aaronasterling在评论上发布的链接,其中可以阅读更多内容: http://mail.python.org/pipermail/python-bugs-list/2007-January/036866.html

        3
  •  1
  •   Ant    13 年前

    你为什么要把它复杂化?我认为最简单的方法(和“标准”方法)是

    class FakeFoo(object):
        def is_valid():
            return False
    

    此外,在这种情况下,lambda的使用并不好…看看这个: http://python-history.blogspot.com/2009/04/origins-of-pythons-functional-features.html 是由BDFL

    等等…