python - 如何在列表中搜索名称并使用 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)
解决方案
首先,你的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 不在列表中
推荐阅读
- python - 如何在 scikit-learn 中使用交叉验证获得预测概率
- c - 如何正确构建具有字符结构的链表
- css - 带进度条的引导输入组
- angular - (激活)事件
当我运行 ng build --prod 时不起作用 - git - 有没有办法限制 ssh 密钥/用户访问 repo 的某些部分?
- php - 任何人都有使用 GCP 使用 PHP 和 Drive API 在 Google Drive 中创建文件夹的经验吗?
- c# - 为什么我的 DISTINCT 查询在 CosmosDB 数据资源管理器中停止工作,但在 C# API 中工作?
- java - 如何修复/学习有助于理解基本方法和类、Java 代码和单词问题
- sophoslabs-intelix - Intellix API 的限制
- sass - 有没有办法结合scss嵌套和tailwindcss?