gpt4 book ai didi

python - 在自定义类对象列表上使用 __contains__

转载 作者:太空狗 更新时间:2023-10-30 01:57:53 25 4
gpt4 key购买 nike

我有一个这样定义的简单类:

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 时,它应该会失败。根本不应该重新创建用户 ID 3,因为它是 users 变量初始化的一部分。

在与我的类的多个实例进行比较时,如何通过 __contains__ 方法进行修改以便能够正确利用 in

最佳答案

如果 users 是一个用户列表并且您检查了 if i in users,那么您没有检查 User.__contains__。您正在检查 list.__contains__。无论您在 User.__contains__ 中做什么,都不会影响检查 i 是否在列表中的结果。

如果你想检查 i 是否与 users 中的任何 User 匹配,你可以这样做:

if any(i in u for u in users)

或者更清楚一点:

if any(u.id==i for u in users)

并完全避免使用 User.__contains__

关于python - 在自定义类对象列表上使用 __contains__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35366644/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com