这是一些描述我的问题的测试代码。我创建了两个类,如下所示......
class Card:
def __init__(self, suit, rank):
self.suit = suit
self.rank = rank
class Deck:
def __init__(self):
self.cards = []
for suit in range(4):
for rank in range(13):
card = Card(suit, rank)
self.cards.append(card)
d = Deck()
d.cards.remove(Card(1, 1))
在上一次删除命令之后,我收到以下错误:
Traceback (most recent call last):
File "<pyshell#111>", line 1, in <module>
d.cards.remove(Card(1, 1))
ValueError: list.remove(x): x not in list
有谁知道为什么会这样?我可以确认d对象从(0,0)到(3,13)的52个总卡对象初始化。为什么删除模块没有检测到这个?此外,我可以在初始化后执行以下命令,它没有问题。
d.cards.append(Card(1, 1))
d.cards.remove(Card(1, 1))
这会添加然后删除刚刚添加到列表中的卡,但它不会删除使用相同值初始化的卡。
答案 0 :(得分:5)
您没有定义两个ConnectedThread
实例何时相等。如果没有这样的定义,Card
找不到任何相同的内容(list.remove()
为真)。自定义类的默认实现仅在对象相同时才是相同的(完全相同的对象,obj1 == obj2
为真)。
在您的班级中添加__eq__
method,以定义reference1 is reference2
个实例的平等含义。
例如,如果Card
和Card
相等且两个rank
实例相等,则执行该测试:
suit
现在def __eq__(self, other):
if not isinstance(other, Card):
return NotImplemented
return self.rank == other.rank and self.suit == other.suit
可以找到第一个测试的对象,它等于你传递给该方法的对象。
请注意:
list.remove()
未定义d.cards.append(Card(1, 1))
d.cards.remove(Card(1, 1))
的情况下, 无法正常工作。该代码创建了两个单独的实例,如果没有自定义__eq__
方法,则两个单独的实例永远不会相等。
你最有可能这样做了:
__eq__
因为只有这样才能使对象测试相等;毕竟,它是同一个对象。