2010-10-14 35 views
6

我有一個方法isValid類Foo。然後我有一個方法bar()接收一個Foo對象,其行爲取決於它是否有效。什麼是我可以添加屬性的最普通的python類型?

爲了測試這一點,我想某些對象傳遞給條,其的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 

但這似乎太長了一槍。必須有一些我可以用於此目的的易於使用的一般類型,但是哪一個?

回答

6

你有正確的想法,但你可以把它更普遍。無論是

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

class tmptype(object): 
    pass 

然後,你可以做

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

像你想與object做。這樣,您可以使用相同的類來滿足您的所有動態修補需求。

+0

嗯,這基本上是在更多的線路,並用新的風格類,而不是傳播同樣的事情。但是我的問題仍然存在:是不是有一些通用的可用類型來實現相同的目的?類似於__dict__的對象?我真的需要爲此創建一個類型嗎? – ricab 2010-10-14 14:39:49

+0

@ricab:這是對我剛剛脫谷歌的想法的拒絕。您可能能夠找到其他人。 http://mail.python.org/pipermail/python-bugs-list/2007-January/036866.html – aaronasterling 2010-10-14 14:59:33

+0

哦,好了,所以沒有這樣的類型。不過,我覺得我可能只是缺少...謝謝 – ricab 2010-10-14 15:06:00

1

爲什麼你必須有讓它複雜?我想最簡單的方法(和「標準」的方式)是做

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

此外,使用拉姆達是不是在這方面好...一起來看看這個: http://python-history.blogspot.com/2009/04/origins-of-pythons-functional-features.html 是在BDFL

等等...

+0

因爲我不想用額外的課程來分散讀者的注意力,因爲這些課程的用途可能讓他難以理解,而且他可能不得不尋找。此外,因爲這種方式的類型的定義是唯一的地方,它的唯一對象是創建,爲了一個單一的目的,你可以馬上找到。該定義是使用它的地方,它允許測試是獨立的。當你看到對象時,你會看到類型定義,當你看到類型定義時,你就知道它的唯一目的。對象和類型的目的都很清楚,而不必看別處。 – ricab 2010-10-14 16:50:11

+0

順便說一句,我閱讀文章,我不明白它是如何遵循使用拉姆達在上下文中不好... – ricab 2010-10-14 16:58:01

+0

我知道這是爲了一個單一的目的等...但它不是正確的方式做到這一點,在我看來...我可以寫try:a.next(),除了StopIterationError:在x中傳遞intend爲:#pass但它不是正確的方式...我知道在某些情況下你可以使用它,但爲什麼你應該這樣做?在我看來,我說...這篇文章是關於lambda的使用,它寫道lambda不應該用來代替普通的'def',但只有當python需要表達式而不是語句時。 ..所以,你可以做到這一點,但我不減薄這是在問題的正確方法... – Ant 2010-10-14 17:09:29

相關問題