|
|
发表于 2025-4-19 22:12:31
|
显示全部楼层
请回复您的答案^_^
-------- 问答题 --------
第 0 题的答案是:
方法重写(Override)、鸭子类型(Duck Typing)
第 1 题的答案是:
多态的优势是代码复用率高,可读性强,结构清晰
第 2 题的答案是:
从广义多态的角度来看是符合多态概念,符合多态 “一个接口,多种实现” 的本质特征,
但更多地体现了 Python 中运算符重载这一特性
第 3 题的答案是:
When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck.
第 4 题的答案是:
使用鸭子类型既有助于增强内聚性,也能够降低耦合度
鸭子类型对增强内聚性的作用:鸭子类型关注的是对象的行为(方法和属性),
而不是对象的具体类型。这使得每个类可以专注于实现自身的核心功能,
将相关的操作封装在类内部,从而提高类的内聚性。
鸭子类型对降低耦合度的作用:鸭子类型使得代码不依赖于对象的具体类型,
而是依赖于对象的行为。这减少了模块之间的类型依赖,降低了代码的耦合度。
当一个模块需要与另一个模块交互时,只需要关注对方是否具备所需的行为,
而不需要了解对方的具体实现细节。
第 5 题的答案是:
不属于
参数数量不同但操作单一
未涉及不同类型对象的不同处理
-------- 动动手 --------
请将第 0 题的代码写在下方:
# 初始化会员字典
members = {}
# 定义 job 字典
job_dict = {
"E": "普通员工",
"T": "组长",
"M": "经理"
}
# 定义每个职位的最高级别
job_max_grade = {
"E": 10,
"T": 6,
"M": 3
}
# 定义职位顺序
job_order = ["E", "T", "M"]
class Members:
def __init__(self, name, job, grade, year, uid):
self.name = name
valid_job = job_order # job_order 是 ["E", "T", "M"]
if job in valid_job:
self.job = job
else:
raise ValueError(f"职位必须是 {valid_job} 中的一个。") # 直接使用列表
# 获取当前职位的最高级别
current_max_grade = job_max_grade[job] # 通过字典键访问值
if job == "E":
if 1 <= grade <= current_max_grade:
self.grade = grade
else:
raise ValueError(f"当职位为 'E' 时,级别必须在 1 到 {current_max_grade} 之间。")
elif job == "T":
if 1 <= grade <= current_max_grade:
self.grade = grade
else:
raise ValueError(f"当职位为 'T' 时,级别必须在 1 到 {current_max_grade} 之间。")
elif job == "M":
if 1 <= grade <= current_max_grade:
self.grade = grade
else:
raise ValueError(f"当职位为 'M' 时,级别必须在 1 到 {current_max_grade} 之间。")
self.year = year
self.uid = uid
def get_uid(self, uid):
if uid in members:
member = members[uid]
salary = member.get_salary(member.job, member.grade, member.year)
return f'姓名:{member.name}\n职位:{member.job}\n级别:{member.grade}\n工龄:{member.year}\n薪资:{salary}\n'
else:
return '该工号不存在'
def get_name(self):
return (self.name)
def get_job(self):
return (self.job)
def get_grade():
return (self.grade)
def get_year(self):
return (self.year)
def get_salary(self, job, grade, year):
if job == 'E':
j = 3000
l = 500
y =50
elif job == 'T':
j = 4000
l = 800
y =100
elif job == 'M':
j = 5000
l = 1000
y = 1000
return( j + l *grade + y * year)
def upgrade(self, upgrade):
old_salary = self.get_salary(self.job, self.grade, self.year)
new_grade = self.grade + upgrade
current_job_index = job_order.index(self.job)
while new_grade > job_max_grade[self.job]:
if current_job_index < len(job_order) - 1:
current_job_index += 1
self.job = job_order[current_job_index]
new_grade = 1 # 升为上一职位的最低级
else:
new_grade = job_max_grade[self.job]
break
self.grade = new_grade
salary = self.get_salary(self.job, self.grade, self.year)
print(f'升级成功!\n{self.name},工号:{self.uid};升级后职位:{self.job}{self.grade};升级后薪资:{salary}(+{salary - old_salary})')
def downgrade(self, downgrade):
old_salary = self.get_salary(self.job, self.grade, self.year)
new_grade = self.grade - downgrade
current_job_index = job_order.index(self.job)
while new_grade < 1:
if current_job_index > 0:
current_job_index -= 1
self.job = job_order[current_job_index]
new_grade = job_max_grade[self.job] # 降为下一职位的最高级
else:
new_grade = 1
break
self.grade = new_grade
salary = self.get_salary(self.job, self.grade, self.year)
print(f'降级成功!\n{self.name},工号:{self.uid};降级后职位:{self.job}{self.grade};降级后薪资:{salary}({salary - old_salary})')
class Manage:
def __init__(self):
# 这里原代码中 member = Members() 没有意义,因为没传参数会报错,可注释或删除
# member = Members()
pass
def get_valid_job(self):
while True:
job = input("职位(E.普通员工:T.组长:M.经理):")
if job.upper() in ("E", "T", "M"):
job = job.upper()
max_grade = 10 if job == "E" else 6 if job == "T" else 3
return job, max_grade
job = input("职位只能是 E.普通员工、T.组长或 M.经理。请重新录入职位:")
if job.upper() in ("E", "T", "M"):
job = job.upper()
max_grade = 10 if job == "E" else 6 if job == "T" else 3
return job, max_grade
def get_valid_grade(self, job, max_grade):
while True:
try:
grade = int(input("级别:"))
if (job == "E" and 1 <= grade <= 10) or (job == "T" and 1 <= grade <= 6) or (job == "M" and 1 <= grade <= 3):
return grade
grade = input(f"该职位最高级别为:{max_grade},请重新录入级别:")
grade = int(grade)
if (job == "E" and 1 <= grade <= 10) or (job == "T" and 1 <= grade <= 6) or (job == "M" and 1 <= grade <= 3):
return grade
except ValueError:
grade = input(f"输入错误: 级别必须是整数,该职位最高级别为:{max_grade},请重新录入级别:")
try:
grade = int(grade)
if (job == "E" and 1 <= grade <= 10) or (job == "T" and 1 <= grade <= 6) or (job == "M" and 1 <= grade <= 3):
return grade
except ValueError:
continue
def run(self):
while True:
try:
c = int(input("1.录入:2.查询:3.升级:4.降级:5.退出:"))
if c == 1:
name = input("姓名:")
job, max_grade = self.get_valid_job()
year = int(input("工龄:"))
grade = self.get_valid_grade(job, max_grade)
if not members:
uid = 10000
else:
uid = max(int(m) for m in members.keys()) + 1
member = Members(name, job, grade, year, uid)
members[uid] = member
salary = member.get_salary(job, grade, year)
print(f"录入成功! 姓名:{name},工号:{uid},薪资:{salary}")
elif c == 2:
c2 = input("1.员工查询,2.职位查询:")
if c2 == "1":
c2_uid = int(input("请输入工号:"))
if c2_uid in members:
member = members[c2_uid]
print(member.get_uid(c2_uid))
else:
print('该工号不存在')
elif c2 == "2":
c2_job, _ = self.get_valid_job()
job_title = job_dict[c2_job]
job_members = [member for uid, member in members.items() if member.job == c2_job]
if len(job_members) == 0:
print(f'目前公司没有{job_title}!')
else:
print(f"目前{job_title}的人数是{len(job_members)}")
for member in job_members:
print(f"{member.uid} - {member.name}")
else:
print('无效的选项,请输入1 或 2 。')
elif c == 3:
c3_uid = int(input('请输入工号:'))
while c3_uid not in members:
print('该工号不存在,请重新输入!')
c3_uid = int(input('请输入工号:'))
member = members[c3_uid]
up_g = int(input(f"{member.name},工号:{member.uid};当前职位:{member.job}{member.grade};当前薪资:{member.get_salary(member.job, member.grade, member.year)}\n请输入需要增加的级数:"))
member.upgrade(up_g)
elif c == 4:
c4_uid = int(input('请输入工号:'))
while c4_uid not in members:
print('该工号不存在,请重新输入!')
c4_uid = int(input('请输入工号:'))
member = members[c4_uid]
d_g = int(input(f"{member.name},工号:{member.uid};当前职位:{member.job}{member.grade};当前薪资:{member.get_salary(member.job, member.grade, member.year)}\n请输入需要减少的级数:"))
member.downgrade(d_g)
elif c == 5:
break
except ValueError as e:
print(f"输入错误: {e}")
except KeyError:
print("工号不存在,请重新输入。")
def main():
manage = Manage()
manage.run()
if __name__ == "__main__":
main() |
|