我有這樣定義一個簡單的類:自定義類的列表上使用__contains__對象
class User(object):
def __init__(self, id=None, name=None):
self.id = id
self.name = name
def __contains__(self, item):
return item == self.id
使用這個類,我可以做類的單一實例的簡單檢查,像這樣:
>>> user1 = User(1, 'name_1')
>>> 1 in user1
True
>>> 2 in user1
False
這是按預期工作。
但是,如何檢查一個值是否在User
對象的列表中?它似乎總是返回False。
例子:
from random import randint
from pprint import pprint
users = [User(x, 'name_{}'.format(x)) for x in xrange(5)]
pprint(users, indent=4)
for x in xrange(5):
i = randint(2,6)
if i in users:
print("User already exists: {}".format(i))
else:
print("{} is not in users list. Creating new user with id: {}".format(i, i))
users.append(User(i, 'new_user{}'.format(i)))
pprint(users, indent=4)
這將創建類似這樣的輸出:
[ 0 => name_0,
1 => name_1,
2 => name_2,
3 => name_3,
4 => name_4]
6 is not in users list. Creating new user with id: 6
6 is not in users list. Creating new user with id: 6
6 is not in users list. Creating new user with id: 6
3 is not in users list. Creating new user with id: 3
3 is not in users list. Creating new user with id: 3
[ 0 => name_0,
1 => name_1,
2 => name_2,
3 => name_3,
4 => name_4,
6 => new_user6,
6 => new_user6,
6 => new_user6,
3 => new_user3,
3 => new_user3]
的問題是,ID爲6
用戶應該只創建了1次,因爲它沒有創建已經。第二次和第三次,6
嘗試,它應該失敗。用戶應該不會重新創建,因爲它是users
變量初始化的一部分。
如何修改__contains__
方法以便在與我的課程的多個實例進行比較時能夠正確使用in
?
'如果有的話(我在你u用戶)' – khelwood
Off topic:你確定你想實施'__contains__'檢查ID?我沒有發現'123 in user'這樣的表達式非常直觀 –
你想讓'user_1'中的'name_1'也是'True'嗎? –