首页 > 解决方案 > 如何在列表中搜索名称并使用 oop - python 中的方法将其删除

问题描述

我编写了一个程序,您可以使用它来管理公司的员工。我将我创建的所有对象保存在我的列表中self .__ staffs = []。是的,我知道这是一个私有属性,我程序中的其他人也是如此,但这是默认值。如果我现在创建类的实例并self .__ staffs = []使用 add_staff 方法将它们保存在列表中,我如何定义一个方法,我可以在其中找到工人的姓名以及他是工人、秘书还是经理并将其从我的列表?我已经尝试过.remove(name),但是这里它只删除了 Staff 类的实例,没有关于他是否是工人的数据,.. 与否。您应该按名称从属性中查找人员对象self .__ staffs,然后将其删除。有人可以帮我吗?提前致谢

这是我的代码:

class StaffList:
    def __init__(self, date: str):
        self.__date = date
        self.__staffs = []

    def get_count(self):
        t = len(self.__staffs)
        for staff in self.__staffs:    
            t -= 0.5
        return int(t) 

    def add_staff(self, staff):
        self.__staffs.append(staff)

    def remove_by_name(self, name):
        self.__staffs.remove(name)

    def __str__(self):
        a = "Date: {}\nThere are {} Staff-Member(s):\n".format(self.__date, self.get_count())
        for i in self.__staffs:
            a += i.__str__()
        return a


class Staff:
    def __init__(self, name: str, salary: int):
        self.__name = name
        self.__salary = salary

    def __str__(self):
        return "    -Members Name and Salary: {} [{}€]\n".format(self.__name, self.__salary)


class Manager(Staff):
    def __init__(self, name, salary, department: str):
        super().__init__(name, salary)
        self.__department = department

    def __str__(self):
        return "        This Member is a Manager and works in the {} department\n".format(self.__department)


class Secretary(Staff):
    def __init__(self, name, salary, has_printer: bool):
        super().__init__(name, salary)
        self.__has_printer = has_printer

    def __str__(self):
        if self.__has_printer is True:
            return "        This Member is a Secretary and has a Printer\n"
        else:
            return "        This Member is a Secretary and has no Printer\n"
    

class Worker(Staff):
    def __init__(self, name, salary, has_driving_licence: bool):
        super().__init__(name, salary)
        self.__has_driving_licence = has_driving_licence

    def __str__(self):
        if self.__has_driving_licence is True:
            return "        This Member is a Worker and has a driving licence\n"
        else:
            return "        This Member is a Wroker and has no driving licence\n"


datum = StaffList("22.11.2020")

staff1 = Staff("Josep Lanington", 2500)
datum.add_staff(staff1)
manager1 = Manager(staff1, staff1, "Elektronics")
datum.add_staff(manager1)

staff2 = Staff("Elena Kromberger", 1800)
datum.add_staff(staff2)
secretary1 = Secretary(staff2, staff2, True)
datum.add_staff(secretary1)

staff3 = Staff("Peter Angerer", 1500)
datum.add_staff(staff3)
worker1 = Worker(staff3, staff3, False)
datum.add_staff(worker1)

print(datum)

标签: pythonlistoopmethodsinstance

解决方案


首先,你的get_count方法是错误的。应该

def get_count(self):
    return len(self.__staffs)

你在这里做了一些非常奇怪的事情:

manager1 = Manager(staff1, staff1, "Elektronics")
datum.add_staff(manager1)

您创建了一个类 Manager 的实例,将另一个类实例作为名称和薪水。

我想你想要实现的是:

staff1 = Manager("Josep Lanington", 2500, "Elektronics")
datum.add_staff(staff1)

staff2 = Secretary("Elena Kromberger", 1800, True)
datum.add_staff(staff2)

staff3 = Worker("Peter Angerer", 1500, False)
datum.add_staff(staff3)

print(datum)

现在,为了使用 .remove() 方法从列表中删除一个项目,您应该能够将此项目与 .remove() 参数进行比较。但是您的班级不知道如何将参数与字符串进行比较。您可以将此方法添加到您的 Staff() 类中。

def __eq__(self, name):
    if not isinstance(name, str):
        # don't attempt to compare against unrelated types
        return NotImplemented
    return self.__name == name

现在你可以做datum.remove_by_name("Elena Kromberger")。这不是很优雅(因为您定义__eq__了针对字符串工作的方法),但这可能会让您了解如何继续前进。

要考虑的另一件事是,如果没有具有此类名称的员工,您将收到错误消息

ValueError: list.remove(x): x 不在列表中


推荐阅读