当我尝试从列表中删除 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 所做的那样),可能会发生两种情况(按以下顺序):

  1. 它调用if self._entities_list[i].__eq__(entity)
  2. 它调用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

这里,ab是平等的,但身份不同,而ac是平等的,身份相同。换句话说:

a is b  # False
a is c  # True