当我尝试从列表中删除 object 时,它从来没有告诉我它已找到
When I try to delete an object from a list it never tells me it was found
当我尝试从列表中删除 object 时,它从未找到它并告诉我该名称不在列表中。我尝试获取 self._entitiesList[i]
的标题和实体之一,但我还没有找到一种方法来做到这一点。我在 python 3.8 工作。 class 有 4 个属性:标题、艺术家、流派和持续时间。
存储库:
def __init__(self):
self._entitiesList = []
def find_position(self, entity):
"""
Function that returns the position of an entity
:param entity: (object) given entity
:return: (int) position of entity, -1 if not found
"""
for i in range(len(self._entitiesList)):
if self._entitiesList[i] == entity:
return i
return -1
def delete(self, entity):
"""
Function that deletes a given entity
:raise Exception: if entity does not exists
:param entity: (object) given entity
"""
position = self.find_position(entity)
if position == -1:
raise Exception("Does not exist!")
del self._entitiesList[position]
服务:
def delete_song(self, title, artist, genre, ):
"""
Function that deletes a song by title
:param title: (str) song title
"""
self._music_repository.delete(Music(title, artist, genre, float(0)))
对于控制台:
def __delete_song(self):
title = input("Title: ")
self.__music_service.delete_song(title)
您正在创建一个新的 Music
对象并将其传递给 self._music_repository.delete
,因为它刚刚创建,所以当然不存在于您的列表中。
比较自定义对象时,(就像您对 if self._entities_list[i] == entity
所做的那样),可能会发生两种情况(按以下顺序):
- 它调用
if self._entities_list[i].__eq__(entity)
。
- 它调用
if self._entities_list[i] is entity
。
由于您尚未定义比较方法 def __eq__(self, other)
,python 将执行第二个选项并检查身份。身份不等同于平等
在Music
上定义比较方法,应该可以比较相等。
def __eq__(self, other):
if self.title == other.title and self.artist == other.artist:
return True
else:
return False
我选择说相同名称和相同艺术家的音乐是平等的,但你必须根据自己的喜好来定义逻辑。
在我的回答中,我已将您的 self._entitiesList
替换为 self._entities_list
。 始终与您的命名保持一致并尝试遵循PEP8 naming convention,除非您有充分的理由不这样做。
要详细说明身份与平等之间的区别,请考虑以下内容:
a = ['hello']
b = ['hello']
c = a
这里,a
和b
是平等的,但身份不同,而a
和c
是平等的,身份相同。换句话说:
a is b # False
a is c # True
当我尝试从列表中删除 object 时,它从未找到它并告诉我该名称不在列表中。我尝试获取 self._entitiesList[i]
的标题和实体之一,但我还没有找到一种方法来做到这一点。我在 python 3.8 工作。 class 有 4 个属性:标题、艺术家、流派和持续时间。
存储库:
def __init__(self):
self._entitiesList = []
def find_position(self, entity):
"""
Function that returns the position of an entity
:param entity: (object) given entity
:return: (int) position of entity, -1 if not found
"""
for i in range(len(self._entitiesList)):
if self._entitiesList[i] == entity:
return i
return -1
def delete(self, entity):
"""
Function that deletes a given entity
:raise Exception: if entity does not exists
:param entity: (object) given entity
"""
position = self.find_position(entity)
if position == -1:
raise Exception("Does not exist!")
del self._entitiesList[position]
服务:
def delete_song(self, title, artist, genre, ):
"""
Function that deletes a song by title
:param title: (str) song title
"""
self._music_repository.delete(Music(title, artist, genre, float(0)))
对于控制台:
def __delete_song(self):
title = input("Title: ")
self.__music_service.delete_song(title)
您正在创建一个新的 Music
对象并将其传递给 self._music_repository.delete
,因为它刚刚创建,所以当然不存在于您的列表中。
比较自定义对象时,(就像您对 if self._entities_list[i] == entity
所做的那样),可能会发生两种情况(按以下顺序):
- 它调用
if self._entities_list[i].__eq__(entity)
。 - 它调用
if self._entities_list[i] is entity
。
由于您尚未定义比较方法 def __eq__(self, other)
,python 将执行第二个选项并检查身份。身份不等同于平等
在Music
上定义比较方法,应该可以比较相等。
def __eq__(self, other):
if self.title == other.title and self.artist == other.artist:
return True
else:
return False
我选择说相同名称和相同艺术家的音乐是平等的,但你必须根据自己的喜好来定义逻辑。
在我的回答中,我已将您的 self._entitiesList
替换为 self._entities_list
。 始终与您的命名保持一致并尝试遵循PEP8 naming convention,除非您有充分的理由不这样做。
要详细说明身份与平等之间的区别,请考虑以下内容:
a = ['hello']
b = ['hello']
c = a
这里,a
和b
是平等的,但身份不同,而a
和c
是平等的,身份相同。换句话说:
a is b # False
a is c # True