|
|
发表于 2024-4-10 10:38:57
|
显示全部楼层
请回复您的答案^_^
>>>>> 问答题 <<<<<
第 0 题的答案是:
在Python中,多态是面向对象编程的重要特性之一,它允许不同类的对象对同一个方法作出不同的响应。Python实现多态的方式主要依赖于动态类型特性和鸭子类型(duck typing)。
动态类型特性:Python是一种动态类型语言,它在运行时确定对象的类型。因此,可以将不同类的对象传递给同一个函数或方法,并且它们会根据其自身的类型执行不同的操作。
鸭子类型:在Python中,重要的不是对象是什么类型,而是它能做什么。这就是所谓的“鸭子类型”,即“如果它走起来像鸭子,叫起来像鸭子,那么它就是鸭子”。这意味着一个对象的类型并不重要,只要它实现了特定方法,就可以在代码中被视为另一种类型。
第 1 题的答案是:
多态的优势在于它增强了代码的灵活性、可扩展性和可维护性,使得代码更加模块化和易于理解。以下是多态的一些主要优势:
1. 灵活性和适应性:多态允许使用相同的接口来处理不同类型的对象,从而使得代码更具灵活性和适应性。通过多态,可以根据需要动态地选择合适的方法实现,而无需修改现有的代码结构。
2. 代码重用:通过使用多态,可以将通用的方法定义在父类中,并在子类中实现具体的行为。这样可以避免在不同的类中重复编写相似的代码,提高了代码的重用性。
3. 解耦合:多态减少了对象之间的耦合度,使得类之间的关系更加松散。当一个对象的具体类型发生变化时,只需要调整其引用的对象类型,而不需要修改与之相关的代码,从而降低了代码的维护成本。
4. 扩展性:通过继承和多态,可以轻松地扩展现有的代码功能,只需添加新的子类并实现相应的方法即可,而不需要修改已有的代码。
5. 抽象和封装:多态允许使用抽象的接口来操作对象,而无需了解对象的具体类型。这样可以隐藏对象的实现细节,提高了代码的封装性和安全性。
第 2 题的答案是:可以,加号的多态
第 3 题的答案是:有一只鸟,它看起来像鸭子,走起路来像鸭子,叫起来也像鸭子,那么这个鸟就是鸭子。
第 4 题的答案是:
使用鸭子类型通常有助于增强内聚并降低耦合度。
1.增强内聚:鸭子类型允许对象在运行时动态地决定其类型,而不依赖于显式的继承关系。这意味着在模块内部,对象的类型并不是硬编码的,而是根据其行为(即对象能够执行的方法)来确定。这种方式使得模块专注于处理对象的行为而不是特定的类型,从而增强了模块内的功能联系,提高了内聚度。
2.降低耦合度:鸭子类型通过关注对象的行为而不是具体的类型,降低了模块之间的耦合度。模块之间不再依赖于特定的类或接口,而是依赖于对象是否具有所需的方法。这意味着模块之间的连接更加灵活,不需要直接依赖于特定的类或接口,从而降低了模块之间的耦合度,提高了系统的灵活性和可维护性。
第 5 题的答案是:
这段代码展示了函数 add 的多态性,而不是 Python 中经典的面向对象编程中的多态。在函数 add 中,它可以接受两个或三个参数,并返回它们的和。在第一次调用中,只传递了两个参数,而在第二次调用中传递了三个参数。函数 add 能够根据传递的参数数量动态地调整自己的行为,这体现了函数的多态性。
Python 中的多态通常更与对象的行为相关,是面向对象编程的一个特性,可以通过方法的重载或继承来实现。在这个例子中,我们看到的是函数 add 在不同情况下的多态行为,而不是经典的基于继承和多态的面向对象编程中所谓的多态。
>>>>> 动动手 <<<<<
请将第 0 题的代码写在下方:
"""
请按要求编写一个企业员工管理程序。
需要实现的要求:
a. 员工分类:普通员工(Employee)、组长(Teamleader)、经理(Manager)
b. 员工属性:姓名(name)、职位(job)、级别(grade)、工龄(year)、工号(uid)
c. 员工方法:
get_uid() -- 获取工号
get_name() -- 获取姓名
get_job() -- 获取职位
get_grade() -- 获取级别
get_year() -- 获取工龄
salary() -- 统计并返回薪资(计算方法如下)
d. 员工薪资计算方法:
普通员工:3000 + 500 * 级别 + 50 * 工龄
组长:4000 + 800 * 级别 + 100 * 工龄
经理:5000 + 1000 * (级别 + 工龄)
e. 程序功能:
录入员工数据功能(工号自动分配,由 10000 开始)
查询功能,分为员工查询和职位查询(见程序实现截图)
各类员工级别数量如下:
普通员工:10 级
组长:6 级
经理:3 级
升级功能:支持增加多级;当超过当前职位最高级别时,进行升职操作(无论增加多少个级别,只要发生升职,级别一律初始化为 1 级,见程序实现截图).
降级功能:支持减少多级;当超过当前职位最高级别时,进行升职操作(无论减少多少个级别,只要发生降职,级别一律初始化为当前职位最高级别,见程序实现截图)
录入功能实现如下:
1.录入;2.查询;3.升级;4.降级;5.退出:1
姓名:小甲鱼
职位(E.普通员工;T.组长;M.经理):M
工龄:12
级别:3
录入成功!姓名:小甲鱼,工号:10000,薪资:20000
1.录入;2.查询;3.升级;4.降级;5.退出:1
姓名:不二如是
职位(E.普通员工;T.组长;M.经理):T
工龄:10
级别:8
该职位最高级别为6,请重新录入级别:6
录入成功!姓名:不二如是,工号:10001,薪资:9800
1.录入;2.查询;3.升级;4.降级;5.退出:1
姓名:小师妹
职位(E.普通员工;T.组长;M.经理):E
工龄:5
级别:5
录入成功!姓名:小师妹,工号:10002,薪资:5750
查询功能实现如下:
1.录入;2.查询;3.升级;4.降级;5.退出:2
1.员工查询;2.职工查询:1
请输入工号:10001
姓名:不二如是
职位:T
级别:6
工龄:10
薪资:9800
1.录入;2.查询;3.升级;4.降级;5.退出:2
1.员工查询;2.职工查询:1
请输入工号:10086
该工号不存在!
1.录入;2.查询;3.升级;4.降级;5.退出:2
1.员工查询;2.职工查询:2
职位(E.普通员工;T.组长;M.经理):E
目前普通员工公有 1 人:
10002 - 小师妹
1.录入;2.查询;3.升级;4.降级;5.退出:2
1.员工查询;2.职工查询:2
职位(E.普通员工;T.组长;M.经理):M
目前组长公有 1 人:
10000 - 小甲鱼
程序升降级功能实现如下:
1.录入;2.查询;3.升级;4.降级;5.退出:3
请输入工号:10001
不二如是,工号:10001,当前职位:T6,当前薪资:9800
请输入需要增加的级数:1
升级成功!
不二如是,工号:10001,升级后职位:M1,升级后薪资:16000(+6200)
1.录入;2.查询;3.升级;4.降级;5.退出:2
1.员工查询;2.职工查询:2
职位(E.普通员工;T.组长;M.经理):T
目前公司没有组长!
1.录入;2.查询;3.升级;4.降级;5.退出:4
请输入工号:10001
不二如是,工号:10001,当前职位:M1,当前薪资:16000
请输入需要降低的级数:3
降级成功!
不二如是,工号:10001,降级后职位:T6,降级后薪资:9800(-6200)
1.录入;2.查询;3.升级;4.降级;5.退出:5
程序退出!
"""
class Employee_attribute: # 普通员工
def __init__(self, name, job, grade, year):
self.name = name # 姓名
self.job = job # 职位
self.grade = grade # 级别
self.year = year # 工龄
@staticmethod
def get_uid(number): # 输入员工号,返回用户名、用户职位和级别
return e.employee_dict[number].name, e.employee_dict[number].job, e.employee_dict[number].grade
@staticmethod
def get_name(number): # 根据工号获取姓名
return e.employee_dict[number].name
@staticmethod
def get_job(job_number): # 根据不同的输入获取职位
if job_number.isdecimal(): # 如果输入的是员工编号
return e.employee_dict[job_number].job # 返回用户所属职位
elif job_number == 'E' or job_number == 'T' or job_number == 'M': # 如果用户输入职位
number = 0 # 重复次数
result = [] # 寻找到的员工号
job_title = '' # 职称
for k, v in e.employee_dict.items():
if v.job == job_number:
number += 1
result.append(k)
if job_number == 'E':
job_title = '普通员工'
elif job_number == 'T':
job_title = '组长'
elif job_number == 'M':
job_title = '经理'
print(f'目前{job_title}公有 {number} 人')
for i in result:
print(f'{i} - {e.employee_dict[i].name}')
print()
@staticmethod
def get_grade(number): # 根据工号获取级别
return e.employee_dict[number].grade
@staticmethod
def get_year(number): # 根据工号获取工龄
return e.employee_dict[number].year
@staticmethod
def salary(number): # 统计并返回薪资(计算方法如下)
"""
普通员工:3000 + 500 * 级别 + 50 * 工龄
组长:4000 + 800 * 级别 + 100 * 工龄
经理:5000 + 1000 * (级别 + 工龄)
"""
employee = e.employee_dict[number]
grade = employee.grade
year = employee.year
job = employee.job
if job == 'E': # 普通员工
return 3000 + 500 * grade + 50 * year
elif job == 'T': # 组长
return 4000 + 800 * grade + 100 * year
elif job == 'M': # 经理
return 5000 + 1000 * (grade + year)
@staticmethod
def user_info(user_number):
user_data = Employee_attribute.get_uid(user_number) # 根据用户工号获取用户信息
salary = Employee_attribute.salary(user_number)
print(f'{user_data[0]},工号:{user_number},当前职位:{user_data[1] + str(user_data[2])},当前薪资:{salary}') # 打印用户信息
return user_data, salary
class Employee:
def __init__(self):
self.employee_dict = {} # 员工数据
self.uid_number = '10000' # 员工编号
self.employee_level = [['E', 10], ['T', 6], ['M', 3]] # 职称数据
def employee_choice(self, choice):
if choice == '5': # 退出程序
print('程序退出!')
return True
# 录入员工
elif choice == '1':
input_name = input('姓名:')
# 判断用户输入姓名是否为空或已存在
while input_name == '': # 判断用户名是否为空
input_name = input('姓名不能为空,请重新输入:')
for k, v in e.employee_dict.items(): # 迭代用户字典
while not v.name != input_name: # 如果名字重复则重新输入
input_name = input('用户名已被录入,请重新输入:')
# 允许用户输入小写字母并自动转换成大写,并规范用户输入
input_job = input('职位(E.普通员工;T.组长;M.经理):').upper() # 将用户的输入切换成大写
while input_job not in ['E', 'T', 'M']: # 判断用户输入,如果不是指定输出则重新输入
input_job = input('请输入正确的字母,职位(E.普通员工;T.组长;M.经理):').upper()
# 规范用户的输入为数字
input_year = input('工龄:')
while not input_year.isdecimal(): # 判断用户输入,如果不是指定输出则重新输入
input_year = input('请输入正确的数字,工龄:')
# 获取到用户输入职位对应的最大级别,与用户输入的级别相比,如果大于则需要用户重新输入
max_year = [i[1] for i in self.employee_level if i[0] == input_job][0] # 获取用户职位最大的级别
input_grade = input('级别:')
while not input_grade.isdecimal() or not int(input_grade) <= max_year: # 如果用户输入不是数字且小于职位最大值则重新输入
input_grade = input(f'请输入正确的数字,级别(最大级别为{max_year}):')
# 将用户输入传入字典中
self.employee_dict[self.uid_number] = Employee_attribute(input_name, input_job, int(input_grade), int(input_year)) # 将数据传入字典
# 打印字典内的数据
for k, v in e.employee_dict.items():
print(f'key值为:{k}')
print(f'key类型为:{type(k)}')
print(f'姓名:{v.name}')
print(f'职位:{v.job}')
print(f'级别:{v.grade}')
print(f'工龄:{v.year}')
print(f'薪资:{Employee_attribute.salary(k)}')
print()
print(f'录入成功!姓名:{input_name},工号:{self.uid_number},薪资:{Employee_attribute.salary(self.uid_number)}') # 计算薪资
self.uid_number = str(int(self.uid_number) + 1) # 执行成功后工号加一
print()
# 查询员工数据
elif choice == '2':
user_choice = input('1.员工查询;2.职位查询;')
while user_choice not in ['1', '2']: # 规范用户输入
user_choice = input('请输入正确的数字:1.员工查询;2.职位查询;')
if user_choice == '1': # 根据用户输入的员工号查询员工信息
input_uid = input('请输入工号:')
while input_uid not in e.employee_dict: # 如果用户输入的值不在字典中则重新输入
input_uid = input('并无该工号信息,请重新输入:')
print(f'姓名:{Employee_attribute.get_name(input_uid)}')
print(f'职位:{Employee_attribute.get_job(input_uid)}')
print(f'级别:{Employee_attribute.get_grade(input_uid)}')
print(f'工龄:{Employee_attribute.get_year(input_uid)}')
print(f'薪资:{Employee_attribute.salary(input_uid)}')
print()
elif user_choice == '2': # 根据用户输入的职位查询员工信息
input_job = input('输入查询职位(E.普通员工;T.组长;M.经理):').upper()
while input_job not in ['E', 'T', 'M']: # 判断用户输入,如果不是指定输出则重新输入
input_job = input('输入输入正确的查询职位(E.普通员工;T.组长;M.经理):').upper()
Employee_attribute.get_job(input_job) # 根据用户输入打印职位信息
# 升级员工级别
elif choice == '3':
# 根据用户的输入查询员工信息并打印
user_number = input('请输入需要升级工号:')
while not any(k == user_number for k, v in e.employee_dict.items()): # 查询已存在的员工,如果不存在则重新输入
user_number = input('并无该工号信息,请重新输入:')
old_user_data, old_salary = Employee_attribute.user_info(user_number) # 打印用户信息并返回数据
# 根据用户输入修改员工级别
user_grade = input('请输入需要增加的级数:')
while not user_grade.isdecimal():
user_grade = input('请输入正确,需要增加的级数:')
for i in range(len(self.employee_level)): # 循环职位列表寻找对应职位
k, v = self.employee_level[i] # 将列表中的元素提取出并赋值给k,v
if old_user_data[1] == k: # 如果职位一致
# 情况一,员工提升后的级别在职称范围内
if (old_user_data[2] + int(user_grade)) < v: # 如果还在自身级别内,则直接提升级别
e.employee_dict[user_number].grade = (old_user_data[2] + int(user_grade))
# 情况二,员工提升后的级别大于职称范围内
else: # 如果大于自身级别,则升职
if i == len(self.employee_level) - 1: # 如果正在执行的循环是最后一个则将值职位调到最大
e.employee_dict[user_number].grade = self.employee_level[i][1] # 将职位字典中的值赋值给员工
else: # 如果是正常升职
e.employee_dict[user_number].job = self.employee_level[i + 1][0] # 添加下一阶段的职称
e.employee_dict[user_number].grade = 1 # 将值归一
print('升级成功!')
new_user_data = Employee_attribute.get_uid(user_number) # 根据用户工号获取用户信息
new_salary = Employee_attribute.salary(user_number) # 计算最新薪资
add_salary = new_salary - old_salary # 计算薪资上下幅度
add_salary = '+' + str(add_salary) if add_salary > 0 else '' + str(add_salary) # 如果结果为正整数则添加+号
print(f'{new_user_data[0]},工号:{user_number},升级后职位:{new_user_data[1] + str(new_user_data[2])},升级后的薪资:{new_salary}({add_salary})') # 打印用户信息
print()
# 降级员工级别
elif choice == '4':
# 根据用户的输入查询员工信息并打印
user_number = input('请输入需要降级的工号:')
while not any(k == user_number for k, v in e.employee_dict.items()): # 查询已存在的员工,如果不存在则重新输入
user_number = input('并无该工号信息,请重新输入:')
old_user_data, old_salary = Employee_attribute.user_info(user_number)
# 根据用户输入修改员工级别
user_grade = input('请输入需要增加的级数:')
while not user_grade.isdecimal():
user_grade = input('请输入正确,需要增加的级数:')
for i in range(len(self.employee_level)): # 循环职位列表寻找对应职位
k, v = self.employee_level[i] # 将列表中的元素提取出并赋值给k,v
if old_user_data[1] == k: # 如果职位一致
# 情况一,员工降级后的级别在职称范围内
if (old_user_data[2] - int(user_grade)) > 0: # 如果还在自身级别内,则直接提升级别
e.employee_dict[user_number].grade = (old_user_data[2] - int(user_grade))
# 情况二,员工降级后的级别为负,则降级处理
else:
# 如果需要降级的职位已经是最小的级别
if i == 0: # 如果循环的次数为第一次
e.employee_dict[user_number].grade = 1 # 将值归一
else: # 如果是正常降职
e.employee_dict[user_number].job = self.employee_level[i - 1][0] # 添加下一阶段的职称
e.employee_dict[user_number].grade = self.employee_level[i - 1][1] # 将职位字典中的值赋值给员工
print('降级成功!')
new_user_data = Employee_attribute.get_uid(user_number) # 根据用户工号获取用户信息
new_salary = Employee_attribute.salary(user_number) # 计算最新薪资
add_salary = new_salary - old_salary # 计算薪资上下幅度
add_salary = '+' + str(add_salary) if add_salary > 0 else '' + str(add_salary) # 如果结果为正整数则添加+号
print(f'{new_user_data[0]},工号:{user_number},降级后职位:{new_user_data[1] + str(new_user_data[2])},降级后薪资:{new_salary}({add_salary})') # 打印用户信息
print()
return False # 如果输入的不是5则一直循环
if __name__ == '__main__':
e = Employee() # 实例化对象
try:
while True:
user_input_number = input('1.录入;2.查询;3.升级;4.降级;5.退出:')
if user_input_number.isdigit(): # 判断是否为数字
if 1 <= int(user_input_number) <= 5: # 如果数字为1-5
if e.employee_choice(user_input_number):
break
else:
print('请输入1到5之间的数字!')
else:
print('请输入数字!')
except KeyboardInterrupt: # 如果用户强制关闭程序也会显示
print()
print('程序结束!')
|
|