2016-01-26 14 views
0

我想知道是否有乾淨的方法來檢查貨架是否包含對象。正如你將會在例子中看到的那樣,我們不能像字典那樣做(myObj in list(myDictionary.values()))。如果我搜索一個內置對象(str,int ...),那麼這個寫法將起作用,但如果我搜索其他東西,它將不起作用。檢查一個對象是否在貨架上

import shelve 

class foo(): 
    def __init__(self): 
     pass 

obj = foo() 

test = shelve.open('test') 

test["elmt1"] = 1 
test['elmt2'] = obj 

test.update() 

print(1 in list(test.values())) # Result is True 
print(obj in list(test.values())) # Result is False 

如果沒有任何簡單的解決辦法,我可以明顯地與貨架的副本只有工作,並在我的腳本結束我的副本替換貨架。

回答

3

foo類中定義__eq__,它將起作用。很顯然,你需要弄清楚同一個類的兩個實例之間的平等意味着什麼,它沒有屬性...

E.g.在這種情況下,所有Foo實例的值相等,所以上面的代碼在兩種情況下都會打印爲True。

class Foo(object): 
    def __init__(self): 
     pass 
    def __eq__(self, other): 
     return isinstance(other, Foo) 

而且,好的做法,所有的類都應該從object繼承 - 見Python class inherits objectWhat is the difference between old style and new style classes in Python?獲取更多信息。

+1

這是正確的。你可以通過打印'obj'和'list(test.values())[1]''來看到對象是不一樣的 - 它將是同一個類,但是不同的id,因爲它們是兩個不同的副本。 – viraptor

+0

@Tom Dalton謝謝你的回答!我從來沒有使用'__eq__',所以我會立即調查一下它的使用:) – Morgan

+0

不客氣! –

相關問題