liuhd666 发表于 2025-1-17 16:35:09

请回复您的答案^_^

-------- 问答题 --------1

第 0 题的答案是:

第 1 题的答案是:

第 2 题的答案是:

第 3 题的答案是:

第 4 题的答案是:

第 5 题的答案是:

-------- 动动手 --------

请将第 0 题的代码写在下方:

彭彭不吃虫子 发表于 2025-1-7 12:47:22

请回复您的答案^_^

-------- 问答题 --------

第 0 题的答案是:

第 1 题的答案是:

第 2 题的答案是:

第 3 题的答案是:

第 4 题的答案是:

第 5 题的答案是:

-------- 动动手 --------

请将第 0 题的代码写在下方:

ahluo 发表于 2025-1-2 16:54:11

请回复您的答案^_^

-------- 问答题 --------
第 0 题的答案是:不同输入会有不同的调用

第 1 题的答案是:一个函数可以在不同语境中实现不同功能

第 2 题的答案是:可以

第 3 题的答案是:不知道

第 4 题的答案是:高内聚

第 5 题的答案是:不是

-------- 动动手 --------

请将第 0 题的代码写在下方:

ahnseil 发表于 2024-12-20 20:01:35

不懂

-------- 问答题 --------

第 0 题的答案是:

第 1 题的答案是:

第 2 题的答案是:

第 3 题的答案是:

第 4 题的答案是:

第 5 题的答案是:

-------- 动动手 --------

请将第 0 题的代码写在下方:

Anonymous 发表于 2024-12-17 09:44:05

请回复您的答案^_^

-------- 问答题 --------

第 0 题的答案是:继承与重写

第 1 题的答案是:

第 2 题的答案是:可以

第 3 题的答案是:

第 4 题的答案是:增强了内聚

第 5 题的答案是:不是

-------- 动动手 --------

请将第 0 题的代码写在下方:
class Data:
    def __init__(self,name,job,grade,year,uid,money):
      self.name = name
      self.job = job
      self.grade = grade
      self.year = year
      self.uid = uid
      self.money = money

def count_wages(job,grade,year):
    if job == 'E':
      money = 3000 + 500 * grade + 50 * year
      return money
    elif job == 'T':
      money = 4000 + 800 * grade + 100 * year
      return money
    elif job == 'M':
      money = 5000 + 1000 * (grade + year)
      return money
    else:
      print('没有这种职位')
      pass

def up_grade(up,graded,job0):
    if job0 == 'E' and graded <= 10:
      graded += up
      if 10 < graded <= 16:
            job0 = 'T'
            graded = graded - 10
      elif 16 < graded <= 19:
            job0 = 'M'
            graded = graded - 16
      else:
            print('升级错误')
    elif job0 == 'T' and graded <= 6:
      graded += up
      if 6 < graded <= 9:
            job0 = 'M'
            graded = graded - 6
      else:
            print('升级错误')
    else:
      print('输入有误')
    return graded,job0

def down_grade(down,graded,job0):
    if job0 == 'E':
      if graded - down > 0:
            graded = graded - down
      else:
            print('输入有误')
    elif job0 == 'T':
      if graded - down > 0:
            graded = graded - down
      elif -9 <= graded - down <= 0:
            job0 = 'E'
            graded = graded - down + 10
      else:
            print('输入有误')
    elif job0 == 'M':
      if graded - down > 0:
            graded = graded - down
      elif -5 <= graded - down <= 0:
            job0 = 'T'
            graded = graded - down + 6
      elif -15 <= graded - down < -5:
            job0 = 'E'
            graded = graded - down + 16
    else:
      print('输入有误')
    return graded,job0

all_uid = []

class MainManage:
    def __init__(self):
      self.members = {}
      self.uid = 10000
    def loading(self):
      name = input('姓名:')
      job = input('职位(E.普通员工;T.组长;M.经理):')
      year = int(input('工龄:'))
      grade = int(input('级别:'))
      money = count_wages(job,grade,year)
      member = Data(name,job,grade,year,self.uid,money)
      all_uid.append(self.uid)
      self.members = member
      print(f'录入成功!姓名: {name},工号: {10000},薪资: {money}')
      self.uid += 1
      print(dict(self.members))
    def query(self):
      query_what = input('1.员工查询;2.职位查询:')
      if query_what == '1':
            uid_input = int(input('请输入工号:'))
            while not self.members.get(uid_input):
                uid_input = int(input('该工号不存在'))
            print(f'姓名:{self.members.name}\n职位:{self.members.job}\n级别:{self.members.grade}\n工龄:{self.members.year}')
      elif query_what == '2':
            query_job = input('职位(E.普通员工;T.组长;M.经理):')
            n = 0
            member_list = []
            uid_list = []
            for i in all_uid:
                if self.members.job == query_job:
                  n += 1
                  uid_list.append(i)
                  member_list.append(self.members.name)
                else:
                  continue
            for i,j in member_list,uid_list:
                print(j,' - ',i)
    def upgrade(self):
      get_uid = int(input('请输入工号:'))
      print(f'{self.members.name},工号:{self.members.uid},当前职位:{self.members.job}{self.members.grade},当前薪资:{self.members.money}')
      up = int(input('请输入需要增加的等级:'))
      print('升级成功')
      graded,job0= up_grade(up, self.members.grade, self.members.job)
      self.members.grade = graded
      self.members.job = job0
      money1 = count_wages(self.members.job,self.members.grade,self.members.year)
      print(f'{self.members.name}, 工号: {self.members.uid}, 升级后职位:{self.members.job}{self.members.grade} 升级后薪资: {money1(money1-self.members.money)}')
      self.members.money = money1
    def downgrade(self):
      get_uid = int(input('请输入工号:'))
      print(f'{self.members.name},工号:{self.members.uid},当前职位:{self.members.job}{self.members.grade},当前薪资:{self.members.money}')
      down = int(input('请输入需要减少的等级:'))
      graded,job0 = down_grade(down,self.members.grade,self.members.job)
      self.members.grade = graded
      self.members.job = job0
      money1 = count_wages(self.members.job, self.members.grade, self.members.year)
      print(f'{self.members.name}, 工号: {self.members.uid}, 升级后职位:{self.members.job}{self.members.grade} 升级后薪资: {money1(money1 - self.members.money)}')
      self.members.money = money1
    def main_enter(self):
      s = input('1.录入;2.查询;3.升级;4.降级;5.退出:')
      if s == '1':
            self.loading()
      elif s == '2':
            self.query()
      elif s == '3':
            self.upgrade()
      elif s == '4':
            self.downgrade()
      elif s == '5':
            return 0
m = 1
while m:
    c = MainManage()
    c.main_enter()


sluttypumkin 发表于 2024-12-15 21:10:19

请回复您的答案^_^

-------- 问答题 --------

第 0 题的答案是:同一函数,对象在不同的场景下具有不同的效果体现

第 1 题的答案是:接收不同的对象作为参数,且不用检测参数类型可执行相应的方法

第 2 题的答案是:
可以

第 3 题的答案是:
当我们看见一只鸟的行为与鸭子行为相似的时候,我们就可以称它为鸭子

第 4 题的答案是:
高内聚低耦合

第 5 题的答案是:
不属于

-------- 动动手 --------

请将第 0 题的代码写在下方:

###企业员工管理系统


##员工属性
class EmployeeInfo:
    def __init__(self,name,job,grade,year,uid):
      self.name = name
      self.job = job
      self.grade = grade
      self.year = year
      self.uid = uid
   


###员工分类:普通员工
class Employee():
    def __init__(self,grade,year,job):
      self.grade = grade
      self.year = year
      self.job = job
      
    def salarys(self):
      print(f"grade:{self.grade},year:{self.year},job:{self.job}")
      
      return 3000 + 500 * self.grade + 50 * self.year


class Teamleader():
    def __init__(self,grade,year,job):
      self.grade = grade
      self.year = year
      self.job = job
      
    def salarys(self):
      print(f"grade:{self.grade},year:{self.year},job:{self.job}")

      return 4000 + 800 * self.grade + 100 * self.year


class Manager():
    def __init__(self,grade,year,job):
      self.grade = grade
      self.year = year
      self.job = job
      
    def salarys(self):
      print(f"grade:{self.grade},year:{self.year},job:{self.job}")

      return 5000 + 1000 * (self.grade + self.year)


class Manage:
    def __init__(self):
      self.uid = 10000
      self.employees = {}

    def get_uid(self):
      return self.uid

    def get_name(self):
      self.name = input("姓名:")
      return self.name

    def get_job(self):
         self.job = input("职位(E.普通员工;T.组长;M.经理):")
         return self.job
    def get_grade(self):
         self.grade = int(input("级别:"))
         return self.grade
    def get_year(self):
      self.year = int(input("工龄:"))
      return self.year

    def check_grade(self,job,grade):
      if self.job == 'E':
            if self.grade > 10:
                self.grade = int(input("该职务最高级别为10,请重新录入:"))
            return self.grade
      elif self.job == 'T':
            if self.grade > 6:
                self.grade = int(input("该职务最高级别为6,请重新录入:"))
            return self.grade
      elif self.job == 'M':
            if self.grade > 3:
                self.grade = int(input("该职务最高级别为3,请重新录入:"))
            return self.grade
      
    def confirm_uid(self):
      uid = int(input("请输入工号:"))
      if not self.employees.get(uid):
            print("该工号不存在!")
      
      return uid
      
    def welcome(self):
      ybz = ''
      while ybz != '5':
            ybz = input("1.录入;2.查询;3.升级;4.降级;5.退出:")
            if ybz == '1':
                self.create_info()
            elif ybz == '2':
                self.search()
            elif ybz == '3':
                self.levelup()
            elif ybz == '4':
                self.leveldown()
            elif ybz == '5':
                pass
            
    def salary(self,x):
      return x.salarys()
            
    def create_info(self):
      name = self.get_name()
      uid = self.get_uid()
      job = self.get_job()
      grade = self.get_grade()
      grade = self.check_grade(job,grade)
      year = self.get_year()
      employee = EmployeeInfo(name,job,grade,year,uid)
      
      if job == 'E':
            e = Employee(grade,year,job)
      elif job == 'T':
            e = Teamleader(grade,year,job)
      elif job == 'M':
            e = Manager(grade,year,job)
            
      salary = self.salary(e)
      
      self.employees = employee
      print(f"录入成功!姓名:{name},工号:{uid},薪资:{salary}")
      self.uid += 1

    def search(self):
      ys = ''
      while ys != '3':
            ys = input("1.员工查询;2.职位查询;3.退出查询:")
            if ys == '1':
                uid = self.confirm_uid()
                if self.employees.get(uid):
                  if self.employees.get(uid).uid == uid:
                        print(f"姓名:{self.employees.get(uid).name} ")
                        print(f"职位:{self.employees.get(uid).job} ")
                        print(f"级别:{self.employees.get(uid).grade} ")
                        print(f"工龄:{self.employees.get(uid).year} ")
                        if self.employees.get(uid).job == 'E':
                            e = Employee(self.employees.get(uid).grade,self.employees.get(uid).year,self.employees.get(uid).job)
                        elif self.employees.get(uid).job == 'T':
                            e = Teamleader(self.employees.get(uid).grade,self.employees.get(uid).year,self.employees.get(uid).job)
                        elif self.employees.get(uid).job == 'M':
                            e = Manager(self.employees.get(uid).grade,self.employees.get(uid).year,self.employees.get(uid).job)
                        print(f"薪资:{self.salary(e)}")
                        
            elif ys == '2':
                count = 0
                user = {}
                job = self.get_job()
                for i in set(self.employees):
                  if self.employees.job == job:
                        count += 1
                        user = self.employees.name
                if job == 'E':
                  print(f"目前普通员工共有{count}人")
                elif job == 'T':
                  print(f"目前组长共有{count}人")
                elif job == 'M':
                  print(f"目前经理共有{count}人")
                for keys,values in user.items():
                  print(f"{keys} - {values}")
                  
    def levelup(self):
      uid = self.confirm_uid()
      levelsalary = 0
      levelupsalary = 0
      if self.employees.get(uid):
            if self.employees.get(uid).uid == uid:
                if self.employees.get(uid).job == 'E':
                  e = Employee(self.employees.get(uid).grade,self.employees.get(uid).year,self.employees.get(uid).job)
                elif self.employees.get(uid).job == 'T':
                  e = Teamleader(self.employees.get(uid).grade,self.employees.get(uid).year,self.employees.get(uid).job)
                elif self.employees.get(uid).job == 'M':
                  e = Manager(self.employees.get(uid).grade,self.employees.get(uid).year,self.employees.get(uid).job)
                levelsalary = self.salary(e)
               
                print(f"{self.employees.get(uid).name},",end="")
                print(f"工号:{uid},当前职位:{self.employees.get(uid).job}{self.employees.get(uid).grade} ",end="")
                print(f"当前薪资:{levelsalary}")
               
      level = int(input("请输入需要增加的级数:"))
      
      if self.employees.get(uid).job == 'E':
            while level + self.employees.get(uid).grade - 16 > 3:
                level = int(input("增加级数超过最高等级,请重新录入:"))
            if level + self.employees.get(uid).grade > 10:
                if level + self.employees.get(uid).grade - 10 > 6:
                  self.employees.get(uid).job = 'M'
                  self.employees.get(uid).grade += (level-10-6)
                else:
                  self.employees.get(uid).job = 'T'
                  self.employees.get(uid).grade += (level-10)
            else:
                self.employees.get(uid).grade += level
                  
                        
      elif self.employees.get(uid).job == 'T':
            while level + self.employees.get(uid).grade - 6 > 3:
                level = int(input("增加级数超过最高等级,请重新录入:"))
               
            if level + self.employees.get(uid).grade > 6:
                self.employees.get(uid).job = 'M'
                self.employees.get(uid).grade += (level-6)
            else:
                self.employees.get(uid).grade += level
                  
      elif self.employees.get(uid).job == 'M':
            while level + self.employees.get(uid).grade > 3:
                level = int(input("增加级数超过最高等级,请重新录入:"))
            self.employees.get(uid).grade += level

      if self.employees.get(uid).job == 'E':
            t = Employee(self.employees.get(uid).grade,self.employees.get(uid).year,self.employees.get(uid).job)
      elif self.employees.get(uid).job == 'T':
            t = Teamleader(self.employees.get(uid).grade,self.employees.get(uid).year,self.employees.get(uid).job)
      elif self.employees.get(uid).job == 'M':
            t = Manager(self.employees.get(uid).grade,self.employees.get(uid).year,self.employees.get(uid).job)
            
      levelupsalary = self.salary(t)
      
      print(f"levelupsalary:{levelupsalary}")
      print("升级成功")
      print(f"{self.employees.get(uid).name},",end="")
      print(f"工号:{uid},升级后职位:{self.employees.get(uid).job}{self.employees.get(uid).grade} ",end="")
      print(f"升级后薪资:{levelupsalary}(+{levelupsalary-levelsalary})")

    def leveldown(self):
      uid = self.confirm_uid()
      levelsalary = 0
      levelupsalary = 0
      if self.employees.get(uid):
            if self.employees.get(uid).uid == uid:
                if self.employees.get(uid).job == 'E':
                  e = Employee(self.employees.get(uid).grade,self.employees.get(uid).year,self.employees.get(uid).job)
                elif self.employees.get(uid).job == 'T':
                  e = Teamleader(self.employees.get(uid).grade,self.employees.get(uid).year,self.employees.get(uid).job)
                elif self.employees.get(uid).job == 'M':
                  e = Manager(self.employees.get(uid).grade,self.employees.get(uid).year,self.employees.get(uid).job)
                levelsalary = self.salary(e)
                print(f"{self.employees.get(uid).name},",end="")
                print(f"工号:{uid},当前职位:{self.employees.get(uid).job}{self.employees.get(uid).grade} ",end="")
                print(f"当前薪资:{levelsalary}")
      level = int(input("请输入需要降级的级数:"))
      
      if self.employees.get(uid).job == 'M':
            while self.employees.get(uid).grade < level - 16:
                level = int(input("降级级数小于最低等级,请重新录入:"))
            if self.employees.get(uid).grade<= level :
                if level - self.employees.get(uid).grade <6:
                  self.employees.get(uid).job = 'T'
                  self.employees.get(uid).grade += (6 - level)
                else:
                  self.employees.get(uid).job = 'E'
                  self.employees.get(uid).grade += (16 - level)
            else:
                self.employees.get(uid).grade -= level
                  
                        
      elif self.employees.get(uid).job == 'T':
            while self.employees.get(uid).grade< level - 10:
                level = int(input("降级级数小于最低等级,请重新录入:"))
               
            if self.employees.get(uid).grade <= level :
                self.employees.get(uid).job = 'E'
                self.employees.get(uid).grade += (10-level)
            else:
                self.employees.get(uid).grade -= level
                  
      elif self.employees.get(uid).job == 'E':
            while self.employees.get(uid).grade < level :
                level = int(input("降级级数小于最低等级,请重新录入:"))
            self.employees.get(uid).grade -= level
      if self.employees.get(uid).job == 'E':
            t = Employee(self.employees.get(uid).grade,self.employees.get(uid).year,self.employees.get(uid).job)
      elif self.employees.get(uid).job == 'T':
            t = Teamleader(self.employees.get(uid).grade,self.employees.get(uid).year,self.employees.get(uid).job)
      elif self.employees.get(uid).job == 'M':
            t = Manager(self.employees.get(uid).grade,self.employees.get(uid).year,self.employees.get(uid).job)
            
      levelupsalary = self.salary(t)
      print(f"levelupsalary:{levelupsalary}")
      print("降级成功")
      print(f"{self.employees.get(uid).name},",end="")
      print(f"工号:{uid},降级后职位:{self.employees.get(uid).job}{self.employees.get(uid).grade} ",end="")
      print(f"降级后薪资:{levelupsalary}({levelupsalary-levelsalary})")      
      
def main():
    manage = Manage()
    manage.welcome()
      

python王.. 发表于 2024-12-15 15:52:36

请回复您的答案^_^

-------- 问答题 --------

第 0 题的答案是:

第 1 题的答案是:

第 2 题的答案是:

第 3 题的答案是:

第 4 题的答案是:

第 5 题的答案是:

-------- 动动手 --------

请将第 0 题的代码写在下方:

SHINWY 发表于 2024-12-7 14:57:05

请回复您的答案^_^

-------- 问答题 --------

第 0 题的答案是:

第 1 题的答案是:

第 2 题的答案是:

第 3 题的答案是:

第 4 题的答案是:

第 5 题的答案是:

-------- 动动手 --------

请将第 0 题的代码写在下方:

丁C 发表于 2024-12-5 17:13:29

1

Anonymous 发表于 2024-12-3 21:02:03

请回复您的答案^_^

-------- 问答题 --------

第 0 题的答案是:

第 1 题的答案是:

第 2 题的答案是:

第 3 题的答案是:

第 4 题的答案是:

第 5 题的答案是:

-------- 动动手 --------

请将第 0 题的代码写在下方:

shuo0826 发表于 2024-12-1 15:06:02

请回复您的答案^_^

-------- 问答题 --------

第 0 题的答案是:
通过函数
第 1 题的答案是:
减少代码       
第 2 题的答案是:
可以
第 3 题的答案是:

第 4 题的答案是:
增强了内聚
第 5 题的答案是:
不能
-------- 动动手 --------

请将第 0 题的代码写在下方:
class jobs:
    def __init__(self,zhiwei="E",dengji=1,grade=1):
      self.zhiwei=zhiwei
      self.dengji=int(dengji)
      self.grade=int(grade)
    def djjy(self):
      while int(self.grade) not in range(1,self.dengji+1):
            self.grade=input(f"该职位最高级别为{self.dengji},请重新输入级别")
      return self.grade
   
yg={}
uid=10000      


class yuangong():
    yg={}
    uid=10000   
    zwgx={"E":"普通员工","T":"组长","M":"经理"}
    zjlb=['E1', 'E2', 'E3', 'E4', 'E5', 'E6', 'E7', 'E8', 'E9', 'E10', 'T1', 'T2', 'T3', 'T4', 'T5', 'T6', 'M1', 'M2', 'M3']
    def get_uid(self):
      return self.yg.keys()
    def get_name(self,uid):
      return self.yg
    def get_job(self,uid):
      return self.yg
    def get_grade(self,uid):
      return self.yg
    def get_year(self,uid):
      return self.yg
    def salary(self,job,grade,year):
      grade=int(grade)
      year=int(year)
      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)
      
    def luru(self):
            name=input("姓名:")
            job=input("职位(E.普通员工;T.组长;M.经理):")
            year=input("工龄:")
            grade=int(input("级别:"))
            E=jobs(zhiwei="E",dengji=10,grade=grade)
            T=jobs(zhiwei="T",dengji=6,grade=grade)
            M=jobs(zhiwei="M",dengji=3,grade=grade)
            def jobsdjjy(x):
                return x.djjy()
            grade=jobsdjjy(eval(job))
            self.yg=
            print(f'录入成功!姓名:{name},工号:{self.uid},薪资:{self.salary(job,grade,year)}')
            self.uid+=1
            print()
            

            
    def chaxun(self):
      while True:
            a=input("1.员工查询,2.职位查询:")
            if a=="1":
                uid=int(input("请输入工号:"))
                if uid in self.get_uid():
                  print("姓名",self.get_name(uid))
                  print("职位",self.get_job(uid))
                  print("级别",self.get_grade(uid))
                  print("工龄",self.get_year(uid))
                  print("薪资",self.salary(self.get_job(uid),self.get_grade(uid),self.get_year(uid)))
                else:
                  print("该工号不存在!")
                  print()
                break
            elif a=="2":
                zwcx=[]
                job=input("职位(E.普通员工;T.组长;M.经理):")
                for i,j inself.yg.items():
                  if j==job:
                        zwcx.append(i)
                if len(zwcx)==0:
                  print(f"目前公司没有{self.zwgx}")
                else:
                  print(f"目前{self.zwgx}共有{len(zwcx)}人:")
                  for i in zwcx:
                        print(f"{i} - {self.yg}")
                        print()
                break
    def sj(self):
      uid=int(input("请输入工号:"))
      oldjob=self.get_job(uid)+str(self.get_grade(uid))
      oldsalary=self.salary(self.get_job(uid),self.get_grade(uid),self.get_year(uid))      
      print(f'{self.get_name(uid)},工号:{uid},当前职位{oldjob},当前薪资:{oldsalary}')
      gradeup=int(input("请输入需要增加的级数"))
      newjob=self.zjlb
      if newjob!=oldjob:
            newjob=newjob+"1"
      self.yg=newjob
      self.yg=newjob
      newsalary=self.salary(self.get_job(uid),self.get_grade(uid),self.get_year(uid))
      print("升级成功!")
      print(f'{self.get_name(uid)},工号:{uid},升级后职位{newjob},当前薪资:{newsalary}(+{newsalary-oldsalary})')
      

      
    def jj(self):      
      uid=int(input("请输入工号:"))
      oldjob=self.get_job(uid)+str(self.get_grade(uid))
      oldsalary=self.salary(self.get_job(uid),self.get_grade(uid),self.get_year(uid))      
      print(f'{self.get_name(uid)},工号:{uid},当前职位{oldjob},当前薪资:{oldsalary}')
      gradedown=int(input("请输入需要增加的级数"))
      newjob=self.zjlb
      if newjob!=oldjob:
            if newjob=="E":
                newjob="E10"
            elif newjob=="T":
                newjob="T6"
      self.yg=newjob
      self.yg=newjob
      newsalary=self.salary(self.get_job(uid),self.get_grade(uid),self.get_year(uid))
      print("降级成功!")
      print(f'{self.get_name(uid)},工号:{uid},降级后职位{newjob},当前薪资:{newsalary}({newsalary-oldsalary})')

      
def main():
    y=yuangong()
    while True :
      a=input("1.录入;2.查询;3.升级;4降级;5.退出")
      if a=="1":
            y.luru()
      elif a=="2":
            y.chaxun()
      elif a=="3":
            y.sj()
      elif a=="4":
            y.jj()
      elif a=="5":
            break


Gorgor 发表于 2024-12-1 10:30:40

请回复您的答案^_^

-------- 问答题 --------

第 0 题的答案是:

第 1 题的答案是:

第 2 题的答案是:

第 3 题的答案是:

第 4 题的答案是:

第 5 题的答案是:

-------- 动动手 --------

请将第 0 题的代码写在下方:

hebing 发表于 2024-11-28 16:48:52

请回复您的答案^_^

-------- 问答题 --------

第 0 题的答案是:

第 1 题的答案是:

第 2 题的答案是:

第 3 题的答案是:

第 4 题的答案是:

第 5 题的答案是:

-------- 动动手 --------

请将第 0 题的代码写在下方:

MisterSuperCool 发表于 2024-11-27 17:00:48

请回复您的答案^_^

-------- 问答题 --------

第 0 题的答案是:
同一个运算符、函数或对象在不同的场景下有不同的作用效果和技能
第 1 题的答案是:
多态性的一个主要好处是它增加了代码的灵活性和可重用性。由于不同的对象可以使用相同的接口,我们可以编写更通用的代码,而不必担心对象的具体类型。这也使得代码更容易维护和扩展。
第 2 题的答案是:
可以,这是运算符的多态
第 3 题的答案是:
“如果它看起来像鸭子,像鸭子一样嘎嘎叫,那么它一定是鸭子。 ”
第 4 题的答案是:
低耦合
第 5 题的答案是:
不是
-------- 动动手 --------

请将第 0 题的代码写在下方:
class Member:
    def __init__(self,name,job,grade,year,uid):
      self.name = name
      self.job = job
      self.grade = grade
      self.year = year
      self.uid = uid
    def get_uid(self):
      return self.uid
    def get_name(self):
      return self.name
    def get_job(self):
      pass
    def get_grade(self):
      return self.grade
    def get_year(self):
      return self.year
    def salary(self):
      pass

class Employee(Member):
    def get_job(self):
      return "普通员工"
    def salary(self):
      salary = 3000 + 500*self.grade + 50*self.year
      return salary
   
class Teamleader(Member):
    def get_job(self):
      return "组长"
    def salary(self):
      salary = 4000 + 800*self.grade + 100*self.year
      return salary

class Manager(Member):
    def get_job(self):
      return "经理"
    def salary(self):
      salary = 5000 + 1000*(self.grade + self.year)
      return salary

class Manage:
    members = {}
    jobs = {"普通员工":[],"组长":[],"经理":[]}
    num = 10000
    def interface(self):
      mode = int(input("1.录入;2.查询;3.升级;4.降级;5.退出: "))
      while mode != 5:
            if mode == 1:
                self.register()
            elif mode == 2:
                self.query()
            elif mode == 3:
                self.promotion()
            elif mode == 4:
                self.demotion()
            mode = int(input("1.录入;2.查询;3.升级;4.降级;5.退出: "))
    def register(self):
      name = input("姓名:")
      job = input("职位(E.普通员工;T.组长;M.经理):")
      year = int(input("工龄:"))
      grade = int(input("级别:"))
      while (job == "E" and grade > 10) or (job == "T" and grade > 6) or (job == "M" and grade > 3):
            if job == "E":
                grade = int(input("该职位最高级别为10,请重新录入级别:"))
            elif job == "T":
                grade = int(input("该职位最高级别为6,请重新录入级别:"))
            elif job == "M":
                grade = int(input("该职位最高级别为3,请重新录入级别:"))
      uid = self.num
      self.num += 1
      if job == "E":
            member = Employee(name,job,grade,year,uid)
            self.members = member
            self.jobs["普通员工"].append(member)
      elif job == "T":
            member = Teamleader(name,job,grade,year,uid)
            self.members = member
            self.jobs["组长"].append(member)
      elif job == "M":
            member = Manager(name,job,grade,year,uid)
            self.members = member
            self.jobs["经理"].append(member)
      print(f"录入成功!姓名:{name},工号:{uid},薪资:{member.salary()}")
    def query(self):
      approach = int(input("请选择查询模式:1.员工查询;2.职位查询:"))
      if approach == 1:
            code = int(input("请输入工号:"))
            for each in self.members:
                if self.members.uid == code:
                  print(f"姓名:{self.members.name}")
                  print(f"职位:{self.members.get_job()}")
                  print(f"级别:{self.members.grade}")
                  print(f"工龄:{self.members.year}")
                  print(f"薪资:{self.members.salary()}")
                  break
            else:
                print("该工号不存在")
      elif approach == 2:
            level = input("职位(E.普通员工;T.组长;M.经理):")
            if level == "E":
                if len(self.jobs["普通员工"]) == 0:
                  print("目前公司没有普通员工")
                else:
                  print(f"目前普通员工共有{len(self.jobs['普通员工'])}人:")
                  for each in self.jobs["普通员工"]:
                        print(f"{each.uid} -> {each.name}")
            elif level == "T":
                if len(self.jobs["组长"]) == 0:
                  print("目前公司没有组长")
                else:
                  print(f"目前组长共有{len(self.jobs['组长'])}人:")
                  for each in self.jobs["组长"]:
                        print(f"{each.uid} -> {each.name}")
            elif level == "M":
                if len(self.jobs["经理"]) == 0:
                  print("目前公司没有经理")
                else:
                  print(f"目前经理共有{len(self.jobs['经理'])}人:")
                  for each in self.jobs["经理"]:
                        print(f"{each.uid} -> {each.name}")
    def promotion(self):
      code = int(input("请输入工号:"))
      for each in self.members:
            if self.members.uid == code:
                print(f"{self.members.name},工号:{self.members.uid},当前职位:{self.members.job+str(self.members.grade)},当前薪资:{self.members.salary()}")
                promotion = int(input("请输入需要增加的级数:"))
                salary_old = self.members.salary()
                if self.members.job == 'E':
                  if promotion + self.members.grade > 10:
                        name = self.members.name
                        job = 'T'
                        grade = 1
                        year = self.members.year
                        uid = self.members.uid
                        self.members = Teamleader(name,job,grade,year,uid)
                        for i in self.jobs["普通员工"]:
                            if i.uid == uid:
                              self.jobs["组长"].append(i)
                              self.jobs["普通员工"].remove(i)
                              break                              
                  else:
                        self.members.grade += promotion
                elif self.members.job == 'T':
                  if promotion + self.members.grade > 6:
                        name = self.members.name
                        job = 'M'
                        grade = 1
                        year = self.members.year
                        uid = self.members.uid
                        self.members = Manager(name,job,grade,year,uid)
                        for i in self.jobs["组长"]:
                            if i.uid == uid:
                              self.jobs["经理"].append(i)
                              self.jobs["组长"].remove(i)
                              break
                  else:
                        self.members.grade += promotion
                elif self.members.job == 'M':
                  if promotion + self.members.grade > 3:
                        print("超出最高职位和级别,无法完成升级!")
                        break
                  else:
                        self.members.grade += promotion
                print("升级成功!")
                print(f"{self.members.name},工号:{self.members.uid},升级后职位:{self.members.job+str(self.members.grade)},升级后薪资:{self.members.salary()}(+{self.members.salary() - salary_old})")
                break   
      else:
            print("该工号不存在")
    def demotion(self):
      code = int(input("请输入工号:"))
      for each in self.members:
            if self.members.uid == code:
                print(f"{self.members.name},工号:{self.members.uid},当前职位:{self.members.job+str(self.members.grade)},当前薪资:{self.members.salary()}")
                promotion = int(input("请输入需要减少的级数:"))
                salary_old = self.members.salary()
                if self.members.job == 'E':
                  if self.members.grade - promotion < 1:
                        print("低于最低职位和级别,无法完成降级!")
                        break
                  else:
                        self.members.grade -= promotion
                elif self.members.job == 'T':
                  if self.members.grade - promotion < 1:
                        name = self.members.name
                        job = 'E'
                        grade = 10
                        year = self.members.year
                        uid = self.members.uid
                        self.members = Employee(name,job,grade,year,uid)
                        for i in self.jobs["组长"]:
                            if i.uid == uid:
                              self.jobs["普通员工"].append(i)
                              self.jobs["组长"].remove(i)
                              break
                  else:
                        self.members.grade -= promotion
                elif self.members.job == 'M':
                  if self.members.grade - promotion < 1:
                        name = self.members.name
                        job = 'T'
                        grade = 6
                        year = self.members.year
                        uid = self.members.uid
                        self.members = Teamleader(name,job,grade,year,uid)
                        for i in self.jobs["经理"]:
                            if i.uid == uid:
                              self.jobs["组长"].append(i)
                              self.jobs["经理"].remove(i)
                              break
                  else:
                        self.members.grade -= promotion
                print("降级成功!")
                print(f"{self.members.name},工号:{self.members.uid},降级后职位:{self.members.job+str(self.members.grade)},降级后薪资:{self.members.salary()}(-{salary_old - self.members.salary()})")
                break   
      else:
            print("该工号不存在")

def main():
    manage = Manage()
    manage.interface()

main()
      

DC3339 发表于 2024-11-26 13:06:34

请回复您的答案^_^

-------- 问答题 --------

第 0 题的答案是:

第 1 题的答案是:

第 2 题的答案是:

第 3 题的答案是:

第 4 题的答案是:

第 5 题的答案是:

-------- 动动手 --------

请将第 0 题的代码写在下方:

Wiiiim 发表于 2024-11-24 17:57:02

请回复您的答案^_^

-------- 问答题 --------

第 0 题的答案是:

第 1 题的答案是:

第 2 题的答案是:

第 3 题的答案是:

第 4 题的答案是:

第 5 题的答案是:

-------- 动动手 --------

请将第 0 题的代码写在下方:

yuki安 发表于 2024-11-21 16:47:00

请回复您的答案^_^

-------- 问答题 --------

第 0 题的答案是:

第 1 题的答案是:

第 2 题的答案是:

第 3 题的答案是:1

第 4 题的答案是:

第 5 题的答案是:属于

-------- 动动手 --------

请将第 0 题的代码写在下方:

正天圣人 发表于 2024-11-18 21:55:49

0.利用对象
1.方面
2.可以
3.不知道
4.增强了内聚
5.不是

jianqkx 发表于 2024-11-17 21:36:22

class Staff:
    def __init__(self,name,job,grade,year,uid,max):
      self.name = name
      self.job = job
      self.grade = grade
      self.year = year
      self.uid = uid
      self.max_grade = max

    def get_uid(self):
      return self.uid
    def get_name(self):
      return self.name
    def get_job(self):
      return self.job
    def get_grade(self):
      return self.grade
    def get_year(self):
      return self.year
    def salary(self):
      pass
    def upgrade(self):
      if self.grade >self.max_grade:
            if self.job == 'E':
                staff = Teamleader(self.name,1,self.year,self.uid)
                return staff
            elif self.job == 'T':
                staff = Manager(self.name,1,self.year,self.uid)
                return staff
            else:
                self.grade = 3
                print("已达到最高级别!")
                return 0
      else:
            return 0      
    def degrade(self):
      if self.grade < 1:
            if self.job == 'E':
                self.grade = 1
                print("已达到最低级别!")
                return 0
            elif self.job == 'T':
                staff = Employee(self.name,10,self.year,self.uid)
                return staff
            else:
                staff = Teamleader(self.name,6,self.year,self.uid)
                return staff
      else:
            return 0

class Employee(Staff):
    def __init__(self, name, grade, year, uid):
      super().__init__(name, "E", grade, year, uid,10)
   
    def salary(self):
      return 3000 + 500*self.grade + 50*self.year
   
class Teamleader(Staff):
    def __init__(self, name, grade, year, uid):
      super().__init__(name, "T", grade, year, uid,6)
   
    def upgrade(self):
      if self.grade >self.max_grade:
            staff = Manager(self.name,1,self.year,self.uid,)
      return staff

    def salary(self):
      return 4000 + 800*self.grade + 100*self.year
   
class Manager(Staff):
    def __init__(self, name,grade, year, uid):
      super().__init__(name, "M", grade, year, uid,3)

    def salary(self):
      return 5000 + 1000*(self.grade+self.year)

class Staff_manage:
    def __init__(self):
      self.uid = 10000
      self.staffs = {}

    def welcome(self):
      ins = 0
      while int != '5':
            ins = input("1.录入;2.查询;3.升级;4.降级;5.退出:")
            if ins == '1':
                self.input_staff()
                print('\n')
            elif ins == '2':
                self.view_staff()
                print('\n')
            elif ins == '3':
                self.upgrade()
                print('\n')
            elif ins == '4':
                self.degrade()
                print('\n')

    def verify_grade(self,job,grade):
      if job == 'E':
            while grade > 10:
                grade = int(input("该职位级别最高为10,请重新录入级别:"))
            return grade
      elif job == 'T':
            while grade > 6:
                grade = int(input("该职位级别最高为6,请重新录入级别:"))
            return grade
      else:
            while grade > 3:
                grade = int(input("该职位级别最高为3,请重新录入级别:"))
            return grade
   
    def verify_staff(self):
      _uid = int(input("请输入工号:"))
      staff = self.staffs.get(_uid,0)
      if staff == 0:
            print("该工号不存在!")
            return 0
      else:
            return staff
      
    def input_staff(self):
      name = input("姓名:")
      job = input("职位(E.普通员工;T.组长;M.经理):")
      year = int(input("工龄:"))
      grade = self.verify_grade(job,int(input("级别:")))
      if job == "E":
            staff = Employee(name,grade,year,self.uid)
            self.staffs = staff
      elif job == "T":
            staff = Teamleader(name,grade,year,self.uid)
            self.staffs = staff
      elif job == "M":
            staff = Manager(name,grade,year,self.uid)
            self.staffs = staff
      print(f"录入成功!姓名:{name},工号:{self.uid},薪资:{staff.salary()}",end="\n")
      self.uid += 1

    def view_staff(self):
      _ins = input("1.员工查询;2.职位查询:")
      if _ins == '1':
            staff = self.verify_staff()
            if staff != 0:
                print(f"姓名:{staff.name}\n职位:{staff.job}\n级别:{staff.grade}\n工龄:{staff.year}\n薪资:{staff.salary()}\n")
      else:
            _job = input("职位(E.普通员工;T.组长;M.经理):")
            _list =
            if len(_list) == 0:
                print(f"目前公司没有{'普通员工' if _job == 'E' else '组长' if _job == 'T' else '经理'}\n")
            else:
                print(f"目前{'普通员工' if _job == 'E' else '组长' if _job == 'T' else '经理'}共有{len(_list)}人:")
                for each in _list:
                  print(f"{each.uid} - {each.name}")

    def upgrade(self):
      staff = self.verify_staff()
      old_salary = staff.salary()
      print(f"{staff.name},工号:{staff.uid},当前职位:{staff.job + str(staff.grade)},当前薪资:{old_salary}")
      up_grade = int(input("请输入需要增加的级别:"))
      staff.grade += up_grade
      result = staff.upgrade()
      if result != 0:
            staff = result
      print("升级成功!")
      now_salary = staff.salary()
      print(f"{staff.name},工号:{staff.uid},升级后职位:{staff.job + str(staff.grade)},升级后薪资:{now_salary}(+{now_salary-old_salary})")
      self.staffs = staff

    def degrade(self):
      staff = self.verify_staff()
      old_salary = staff.salary()
      print(f"{staff.name},工号:{staff.uid},当前职位:{staff.job + str(staff.grade)},当前薪资:{old_salary}")
      de_grade = int(input("请输入需要减少的级别:"))
      staff.grade -= de_grade
      result = staff.degrade()
      if result != 0:
            staff = result
      print("降级成功!")
      now_salary = staff.salary()
      print(f"{staff.name},工号:{staff.uid},升级后职位:{staff.job + str(staff.grade)},升级后薪资:{now_salary}(-{old_salary-now_salary})")
      self.staffs = staff

def main():
    manage = Staff_manage()
    manage.welcome()请将第 0 题的代码写在下方:

she200471 发表于 2024-11-17 00:24:27

0.
子類別可以重寫父類別的方法

1.
在函式中不會看你傳入內容的型別,有相關方法就會操作

2.
可以,這是運算子的多型

3.
有一隻鳥走起路來像鴨子、叫聲也像鴨子,就會把牠當成鴨子

4.
高內聚低耦合,是判斷軟體設計好壞的標準。在程式設計中,我們都希望盡可能做到高內聚(內聚,Cohesion是從功能角度來衡量模組內部的關聯性,一個好的內聚模組應該只負責完成一件事,它描述的是模組內的功能聯繫)和低耦合(耦合coupling,是軟體結構中各模組之間相互連結的一種衡量,耦合的強弱取決於模組間介面的複雜程度、進入或存取某個模組的方式以及透過介面傳遞的資料)。那麼請問,使用鴨子型別,是增強了內聚還是降低了耦合度呢?


降低了耦合度


內聚 (Cohesion)
定義:
內聚是衡量模組內部功能元素之間相關性的一個指標。內聚越高,模組內部的功能元素越緊密地聚合在一起,越能有效完成特定的單一任務。

特徵:

高內聚的模組通常專注於完成一件事,功能單一且明確。
模組內的程式碼彼此高度相關,改變某一部分時,影響範圍僅限於該模組內部。
高內聚可以提升程式的可維護性、可讀性,並降低未來擴展或修改的複雜度。
內聚的種類(從低到高):

偶然性內聚:模組內的功能幾乎無關聯,僅是偶然放在一起。
邏輯性內聚:模組內的功能通過邏輯條件來選擇執行,但彼此不直接相關。
時間性內聚:模組內的功能在同一時間段執行,僅因執行時序相同而組合。
程序性內聚:模組內的功能依執行程序先後排列,彼此有一定依賴。
通訊性內聚:模組內的功能操作同一資料集,具有共通目標。
功能性內聚:模組專注於完成單一明確的任務,最高級別的內聚。
耦合 (Coupling)
定義:
耦合是衡量不同模組之間相互依賴程度的一個指標。耦合越低,模組間的關聯越鬆散,彼此獨立性越高。

特徵:

模組間的耦合性越低,模組的獨立性越高,系統的靈活性和可擴展性越好。
耦合高則表示模組間依賴過多,改動一個模組可能會導致連鎖反應,影響其他模組。
耦合的種類(從高到低):

內容耦合:一個模組直接存取或修改另一模組的內部資料或邏輯,最壞的情況。
共用耦合:多個模組共同存取同一全域資料,增加潛在衝突。
外部耦合:模組依賴於外部的介面、裝置或資料格式。
控制耦合:一個模組控制另一模組的行為(例如傳遞控制旗標)。
資料耦合:模組間僅透過簡單資料結構(如參數)進行交換,關聯性較低。
訊息耦合:模組間僅透過訊息(例如呼叫方法或函數)交換資料,是最低的一種耦合。
內聚與耦合的關係
高內聚和低耦合是理想的程式設計目標。
高內聚確保模組內部功能集中,改動影響範圍小。
低耦合減少模組間的依賴性,增加系統靈活性和可維護性。
二者是一體兩面:提升內聚通常可以幫助降低耦合,反之亦然。例如,功能單一的模組自然不需要與太多外部模組交互,耦合性也會隨之降低。
簡單比喻
內聚可以理解為團隊的專業度,每個人專注於自己的工作。
耦合則是團隊之間的合作關係,彼此不需要過多干涉,但可以有效協作。
一個成功的專案需要團隊專業度(高內聚)和團隊間協作效率(低耦合)兼顧。


5.
這不算,只是傳進去值然後z有預設值而已

動手:

0.

以下是我目前的程式碼,尚未完成
請提示我該修改的地方,僅提示即可,不要直接給我程式碼

class Employee:
    def __init__(self, name, job, year, grade, uid):
      self.name = name
      self.job = job
      self.grade = grade
      self.year = year
      self.uid = uid

   
    def get_uid(self):
      return self.uid
    def get_name(self):
      return self.name
    def get_job(self):
      return self.job
    def get_grade(self):
      return self.grade
    def get_year(self):
      return self.year
    def salary(self, grade, year): #計算工資
      salary = 3000 + 500 * grade + 50 * year
      return salary


class Teamleader(Employee):
    def salary(self, grade, year):
      salary = 4000 + 800 * grade + 100 * year
      return salary

class Manager(Employee):
    def salary(self, grade, year):
      salary = 5000 + 1000 * (grade + year)
      return salary


class Check():
    def num_error(arg):
      try:
            int(arg)
            return arg
      except:
            print("請輸入正確的數字")
            return False
            
    def grade_check(grade, job):
      if job == "E":
            limit = 10
      elif job == "T":
            limit = 6
      elif job == "M":
            limit = 3
      
      if 0 < grade <= limit:
            return grade
      else:
            print(f"該職位最高級別為{limit},請重新輸入")
            return False
   
    def upgrade_check(job, grade):
      if job == "E":
            limit = 10
      elif job == "T":
            limit = 6
      elif job == "M":
            limit = 3
      
      if 0 < grade <= limit:
            return job, grade
      if grade > limit:
            if job == "E":
                job = "T"
            elif job == "T":
                job = "M"
            grade = 1
            return job, grade
      

class Func(Check):
    def __init__(self):
      self.members = {}
      self.uid = 10000

    # 程式功能入口
    def main_func(self):
      while ins != '5':
            ins = input("\n1.輸入資料;2.查詢資料;3.升級;4.降級;5.退出程式:")
            if ins == '1':
                self.record_emp()
            if ins == '2':
                self.search_emp()
            if ins == '3':
                self.upgrade()
            if ins == '4':
                self.downgrade()
            if ins == '5':
                print("已退出員工管理系統")


    def record_emp(self): #輸入員工資料
      name = input("姓名:")
      job = input("職位:(E.普通員工;T.組長;M.經理)").upper()

      while not year:
            year = input("工齡:")
            year = Check.num_error(year)
      while not grade:
            grade = input("級別:")
            grade = Check.num_error(grade)
            grade = Check.grade_check(grade, job)
   
      uid = self.uid
      emp = Employee(name, job, year, grade, uid)   
      
      self.members = emp #記錄到members字典
      self.salary = self.salary(grade, year)
      
      print(f"輸入成功!姓名:{self.name},工號:{self.uid},薪資:{self.salary}")

      self.uid += 1 #輸入一次就改一次卡號

    def search_emp(self):
      search_opt = input("1.員工查詢;2.職位查詢")
      if search_opt == "1":
            uid = input("請輸入工號:")
            while not self.members.get(uid):
                uid = int(input("該工號不存在,請重新輸入:"))

            else:
                print(f'''姓名:{self.members.get(uid).name}\n
                      職位:{self.members.get(uid).job}\n
                      級別:{self.members.get(uid).grade}\n
                      工齡:{self.members.get(uid).year}\n
                      薪資:{self.members.get(uid).salary()}\n''')


      elif search_opt == "2":
            total_value = self.members.values()
            job_input = input("請輸入職位:(E.普通員工;T.組長;M.經理)").upper()

            if job == "E":
                title = "普通員工"
            elif job == "T":
                title = "組長"
            elif job == "M":
                title = "經理"

            count = total_value.count(f"{job_input}")
            if count:
                print(f"目前{title}共有{count}人:")
            else:
                print(f"目前公司沒有{title}!")

            for job in self.members.values():
                if job == job_input:
                  print(f"{self.members.get(uid)} - {self.members.get(uid).name}")

      else:
            ("輸入錯誤,請重新輸入")

    def upgrade(self):
      uid = input("請輸入工號:")
      while not self.members.get(uid):
            uid = int(input("該工號不存在,請重新輸入:"))

      else:
            print(f'''{self.members.get(uid).name},
                      工號:{self.members.uid},
                      目前職位:{self.members.get(uid).job}{self.members.get(uid).grade}
                      目前薪資:{self.members.get(uid).salary()}''')
            
            while not grade_up:
                grade_up = input("請輸入需要增加的級數:")
                grade_up = Check.num_error(grade_up)

            else:
                grade = self.members.get(uid).grade + int(grade_up)
                job = self.members.get(uid).job
                job, grade = Check.upgrade_check(job, grade)

                old_salary = self.members.get(uid).salary()

                self.members['job'] = job
                self.members['grade'] = grade
                print("升級成功!")

                new_salary = self.members.get(uid).salary()

                print(f'''{self.members.get(uid).name},
                      工號:{self.members.uid},
                      升級後職位:{self.members.get(uid).job}{self.members.get(uid).grade}
                      升級後薪資:{new_salary}({new_salary - old_salary})''')               
      

    def downgrade(self):
      pass



def main():
    f = Func()
    f.main_func()


GPT:

1. 子類 Teamleader 和 Manager 的 salary 方法不需要傳參數
父類的 salary() 方法接受 grade 和 year 作為參數,但這些值已經是物件屬性,因此不需要傳入參數。
修改點:覆寫的 salary() 方法中,直接使用 self.grade 和 self.year。

2. 子類應該初始化基類屬性
Teamleader 和 Manager 應使用 super().__init__() 初始化父類的屬性,避免重複定義。

正確的繼承關係
super().__init__() 確保子類正確初始化基類中的所有屬性和行為,維持物件的一致性。如果你跳過 super().__init__(),子類可能缺失某些基類的邏輯,導致非預期的問題。


3.
3. 檢查和更新 record_emp() 中對子類的處理
record_emp() 中未區分不同職位的員工。當輸入職位時,應根據 job 值創建對應類型的物件 (Employee, Teamleader, Manager)。

確保薪資計算時準確使用到該用的方法


4. 修正薪資計算和顯示
record_emp() 中的 self.salary 呼叫方式錯誤。應該呼叫 emp.salary() 方法,而非 self.salary。
修改點:將 self.salary = self.salary(grade, year) 改為 salary = emp.salary()。

我沒有在基類設置self.salary也可以這樣寫嗎?要設置會更好嗎?
emp.salary()跟self.salary() 差別在哪?



1. emp.salary() 和 self.salary() 的差別
emp.salary():

這裡的 emp 是動態創建的物件(可能是 Employee 或其子類,例如 Teamleader 或 Manager)。
當你調用 emp.salary() 時,會根據物件的實際類型,執行該類型的 salary() 方法。例如:
如果 emp 是 Teamleader,則會執行 Teamleader.salary() 方法。
如果 emp 是 Manager,則會執行 Manager.salary() 方法。
這利用了多態特性,能正確地計算不同職位員工的薪資。
self.salary():

這指的是當前類的 salary() 方法。
如果 record_emp() 是在 Func 類中,self.salary() 指的是 Func 類的 salary() 方法(如果存在)。
如果 Func 類沒有定義 salary() 方法,這樣的調用會導致錯誤。
因此,emp.salary() 是正確的寫法,因為 emp 指向具體的員工物件,而薪資計算邏輯與員工的職位類型(子類)相關。



2. 是否需要在基類設置 self.salary
不一定需要在基類設置 self.salary,但根據你的需求,是否設置取決於以下情況:

不設置 self.salary 的情況
薪資是動態計算的,並不需要保存為物件屬性。例如,你每次需要時都調用 emp.salary() 即可:

適用於薪資計算簡單、對薪資查詢頻率不高的場景。
設置 self.salary 的情況
如果你需要頻繁查詢薪資,或薪資的計算比較複雜且成本較高(例如需要從資料庫讀取或涉及大量運算),保存計算結果為屬性會更高效



5. search_emp() 有錯誤的邏輯和變數使用
self.members.get(uid) 返回的是一個物件,不是字典,無法使用 self.members['job'] 來存取。
修改點:
查詢屬性時應直接從物件存取,例如:self.members.job。
修正職位計數邏輯,應遍歷 self.members.values() 判斷 job 屬性。


1. self.members.get(uid) 返回的值
self.members.get(uid) 的返回值不是 list,而是你之前存入字典的員工物件。

self.members 是一個字典:

其中的鍵(key)是工號(uid),值(value)是員工的物件(如 Employee, Teamleader, Manager)。
當你執行 self.members.get(uid) 時,返回的是 uid 對應的值,也就是一個員工物件。例如:

emp = self.members.get(10001)
# emp 是一個員工物件,可能是 Employee 或其子類


2. self.members.job 的存取邏輯
當 self.members 返回員工物件時,你可以通過點操作符存取該物件的屬性,例如 job:

class Employee:
    def __init__(self, name, job, year, grade, uid):
      self.name = name
      self.job = job
      self.year = year
      self.grade = grade
      self.uid = uid

# 假設 self.members 結構如下:
self.members = {
    10001: Employee(name="Alice", job="E", year=5, grade=3, uid=10001),
    10002: Teamleader(name="Bob", job="T", year=7, grade=2, uid=10002),
    10003: Manager(name="Charlie", job="M", year=10, grade=1, uid=10003),
}

# 存取工號為 10001 的員工職位
emp = self.members# emp 是 Employee(name="Alice", ...)
print(emp.job)# 輸出 "E"


3. 修正職位計數邏輯,遍歷 self.members.values()
問題所在: 你在查詢職位時,嘗試直接統計字典中是否有符合的職位:

count = total_value.count(f"{job_input}")

但 self.members 的值是員工物件,而不是職位字串,這樣統計會報錯或返回錯誤的結果。

正確方式: 需要遍歷 self.members.values(),檢查每個物件的 job 屬性是否與輸入職位相符。以下是詳細邏輯:

job_input = input("請輸入職位:(E.普通員工;T.組長;M.經理)").upper()

# 遍歷所有員工物件,統計符合條件的職位
count = sum(1 for emp in self.members.values() if emp.job == job_input)


self.members.values():返回字典中所有的值(即所有員工物件)。
for emp in self.members.values():迴圈遍歷每個員工物件。
if emp.job == job_input:判斷該員工的 job 是否等於輸入的職位。
sum(1 for ...):每當條件成立時,將 1 加到總數中,最終返回符合條件的員工數量。


請問self.members.get(uid)和emp.members兩種寫法有什麼不同?我要如何判斷在存取字典內容時,什麼時候用emp什麼時候用self?

1. self.members.get(uid) 與 self.members 的差別
1.1 self.members.get(uid)
是 字典的安全存取方法。
當鍵 uid 存在於字典中時,返回該鍵對應的值(例如員工物件)。
當鍵 uid 不存在時,默認返回 None,不會拋出錯誤。
你可以指定一個默認值,如果鍵不存在,返回該默認值。例如:

emp = self.members.get(uid, "Not Found")

1.2 self.members
是 字典的直接存取方式。
當鍵 uid 存在時,返回該鍵對應的值。
當鍵 uid 不存在時,會拋出 KeyError 錯誤。

用法總結:
用 self.members.get(uid) 當:
不確定鍵是否存在,並且希望避免程式崩潰時。
想要在鍵不存在時設置默認值。
用 self.members 當:
確定鍵一定存在,並且希望在鍵缺失時得到即時的錯誤提示(例如調試時使用)。


self
self 是指向當前類的實例。
在你的程式中,self.members 表示的是管理所有員工資料的字典,它是 Func 類的一部分:

因此,self.members 表示這個類別物件所擁有的員工資料,存放了所有員工的工號(鍵)和對應的員工物件(值)。


emp
emp 是在函數或程式區塊內的局部變數,通常代表某個具體的員工物件。
當你查詢某個工號並取得對應員工物件時,會將它賦值給變數 emp:
emp = self.members.get(uid)

此時,emp 是某個特定員工的物件,並非存放所有員工資料的字典。


3.1 使用 self
當你要操作的是「所有員工」相關的資料,應使用 self.members。
例子:
新增員工:self.members = emp
查詢所有員工:for emp in self.members.values()
查找特定工號:emp = self.members.get(uid)

3.2 使用 emp
當你已經取得某個具體的員工物件,並要操作該物件的屬性或方法時,應使用 emp。
例子:
查詢某員工的職位:emp.job
計算某員工的薪資:emp.salary()
修改某員工的屬性:emp.grade = new_grade


修改版:

class Employee:
    def __init__(self, name, job, year, grade, uid):
      self.name = name
      self.job = job
      self.grade = grade
      self.year = year
      self.uid = uid

   
    def get_uid(self):
      return self.uid
    def get_name(self):
      return self.name
    def get_job(self):
      return self.job
    def get_grade(self):
      return self.grade
    def get_year(self):
      return self.year
    def salary(self): #計算工資
      salary = 3000 + 500 * self.grade + 50 * self.year
      return salary


class Teamleader(Employee):
    def __init__():
      super().__init__()

    def salary(self):
      salary = 4000 + 800 * self.grade + 100 * self.year
      return salary

class Manager(Employee):
    def __init__():
      super().__init__()

    def salary(self):
      salary = 5000 + 1000 * (self.grade + self.year)
      return salary


class Check():
    def num_error(arg):
      try:
            int(arg)
            return arg
      except:
            print("請輸入正確的數字")
            return False
            
    def grade_check(grade, job):
      if job == "E":
            limit = 10
      elif job == "T":
            limit = 6
      elif job == "M":
            limit = 3
      
      if 0 < grade <= limit:
            return grade
      else:
            print(f"該職位最高級別為{limit},請重新輸入")
            return False
   
    def upgrade_check(job, grade):
      if job == "E":
            limit = 10
      elif job == "T":
            limit = 6
      elif job == "M":
            limit = 3
      
      if 0 < grade <= limit:
            return job, grade
      if grade > limit:
            if job == "E":
                job = "T"
            elif job == "T":
                job = "M"
            grade = 1
            return job, grade
      

class Func(Check):
    def __init__(self):
      self.members = {}
      self.uid = 10000

    # 程式功能入口
    def main_func(self):
      while ins != '5':
            ins = input("\n1.輸入資料;2.查詢資料;3.升級;4.降級;5.退出程式:")
            if ins == '1':
                self.record_emp()
            if ins == '2':
                self.search_emp()
            if ins == '3':
                self.upgrade()
            if ins == '4':
                self.downgrade()
            if ins == '5':
                print("已退出員工管理系統")
            else:
                print("輸入錯誤,請重新輸入")


    def record_emp(self): #輸入員工資料
      name = input("姓名:")
      job = input("職位:(E.普通員工;T.組長;M.經理)").upper()

      while not year:
            year = input("工齡:")
            year = Check.num_error(year)
      while not grade:
            grade = input("級別:")
            grade = Check.num_error(grade)
            grade = Check.grade_check(grade, job)
   
      uid = self.uid

      #根據職別建立不同實例化物件
      if job == "E":
            emp = Employee(name, job, year, grade, uid)
      elif job == "T":
            emp = Teamleader(name, job, year, grade, uid)
      elif job == "M":
            emp = Manager(name, job, year, grade, uid)

      
      self.members = emp #記錄到members字典
      
      print(f"輸入成功!姓名:{self.members.get(uid).name},工號:{self.members.get(uid).uid},薪資:{emp.salary()}")

      self.uid += 1 #輸入一次就改一次卡號

    def search_emp(self):
      search_opt = input("1.員工查詢;2.職位查詢")
      if search_opt == "1":
            uid = input("請輸入工號:")
            uid = Check.num_error(uid)

            while not self.members.get(uid):
                uid = int(input("該工號不存在,請重新輸入:"))

            else:
                print(f'''姓名:{self.members.get(uid).name}\n
                      職位:{self.members.get(uid).job}\n
                      級別:{self.members.get(uid).grade}\n
                      工齡:{self.members.get(uid).year}\n
                      薪資:{self.members.get(uid).salary()}\n''')


      elif search_opt == "2":
            total_value = self.members.values()
            job_input = input("請輸入職位:(E.普通員工;T.組長;M.經理)").upper()

            if job == "E":
                title = "普通員工"
            elif job == "T":
                title = "組長"
            elif job == "M":
                title = "經理"

            count = sum(1 for emp in self.members.values() if emp.job == job_input)

            if count:
                print(f"目前{title}共有{count}人:")
            else:
                print(f"目前公司沒有{title}!")

            for job in self.members.values():
                if job == job_input:
                  print(f"{self.members.get(uid)} - {self.members.get(uid).name}")

      else:
            ("輸入錯誤,請重新輸入")

    def upgrade(self):
      uid = input("請輸入工號:")
      uid = Check.num_error(uid)
      while not self.members.get(uid):
            uid = int(input("該工號不存在,請重新輸入:"))

      else:
            print(f'''{self.members.get(uid).name},
                      工號:{self.members.uid},
                      目前職位:{self.members.get(uid).job}{self.members.get(uid).grade}
                      目前薪資:{self.members.get(uid).salary()}''')
            
            while not grade_up:
                grade_up = input("請輸入需要增加的級數:")
                grade_up = Check.num_error(grade_up)

            else:
                grade = self.members.get(uid).grade + int(grade_up)
                job = self.members.get(uid).job
                job, grade = Check.upgrade_check(job, grade)

                old_salary = self.members.get(uid).salary()

                self.members.get(uid).job = job
                self.members.get(uid).grade = grade
                print("升級成功!")

                new_salary = self.members.get(uid).salary()

                print(f'''{self.members.get(uid).name},
                      工號:{uid},
                      升級後職位:{self.members.get(uid).job}{self.members.get(uid).grade}
                      升級後薪資:{new_salary}({new_salary - old_salary})''')               
      

    def downgrade(self):
      pass



def main():
    f = Func()
    f.main_func()


GPT:

1. Teamleader 和 Manager 的建構子 (__init__)
目前,Teamleader 和 Manager 的 __init__ 方法尚未正確定義。應該接收與 Employee 一樣的參數,並使用 super() 初始化基類。

class Teamleader(Employee):
    def __init__(self, name, job, year, grade, uid):
      super().__init__(name, job, year, grade, uid)

class Manager(Employee):
    def __init__(self, name, job, year, grade, uid):
      super().__init__(name, job, year, grade, uid)



5. 搜尋功能 (search_emp)
search_emp 方法的 職位查詢 部分存在錯誤:
變數 job 未定義,應使用 job_input。
列印員工資訊時,self.members.get(uid) 是錯誤的,因為 uid 在該上下文未定義。

改進建議:

在 for 循環中正確使用員工物件。 範例:

for emp in self.members.values():
    if emp.job == job_input:
      print(f"{emp.uid} - {emp.name}")


改:
class Employee:
    def __init__(self, name, job, year, grade, uid):
      self.name = name
      self.job = job
      self.grade = grade
      self.year = year
      self.uid = uid

   
    def get_uid(self):
      return self.uid
    def get_name(self):
      return self.name
    def get_job(self):
      return self.job
    def get_grade(self):
      return self.grade
    def get_year(self):
      return self.year
    def salary(self): #計算工資
      salary = 3000 + 500 * self.grade + 50 * self.year
      return salary


class Teamleader(Employee):
    def __init__(self, name, job, year, grade, uid):
      super().__init__(name, job, year, grade, uid)

    def salary(self):
      salary = 4000 + 800 * self.grade + 100 * self.year
      return salary

class Manager(Employee):
    def __init__(self, name, job, year, grade, uid):
      super().__init__(name, job, year, grade, uid)

    def salary(self):
      salary = 5000 + 1000 * (self.grade + self.year)
      return salary


class Check():
    def num_error(arg):
      try:
            int(arg)
            return arg
      except:
            print("請輸入正確的數字")
            return False
            
    def grade_check(grade, job):
      if job == "E":
            limit = 10
      elif job == "T":
            limit = 6
      elif job == "M":
            limit = 3
      
      if 0 < grade <= limit:
            return grade
      else:
            print(f"該職位最高級別為{limit},請重新輸入")
            return False
   
    def updown_grade_check(job, grade, change):
      if job == "E":
            limit = 10
      elif job == "T":
            limit = 6
      elif job == "M":
            limit = 3
      
      if 0 < grade <= limit:
            return job, grade
      if grade > limit:
            if job == "E":
                job = "T"
            elif job == "T":
                job = "M"
            grade = 1
            return job, grade
      if 0 > grade:
            if job == "M":
                job = "T"
                grade = 6
            elif job == "T":
                job = "E"
                grade = 10
            return job, grade            
      

class Func(Check):
    def __init__(self):
      self.members = {}
      self.uid = 10000

    # 程式功能入口
    def main_func(self):
      while ins != '5':
            ins = input("\n1.輸入資料;2.查詢資料;3.升級;4.降級;5.退出程式:")
            if ins == '1':
                self.record_emp()
            if ins == '2':
                self.search_emp()
            if ins == '3' or '4':
                self.up_downgrade()
            if ins == '5':
                print("已退出員工管理系統")
            else:
                print("輸入錯誤,請重新輸入")


    def record_emp(self): #輸入員工資料
      name = input("姓名:")
      job = input("職位:(E.普通員工;T.組長;M.經理)").upper()

      while not year:
            year = input("工齡:")
            year = Check.num_error(year)
      while not grade:
            grade = input("級別:")
            grade = Check.num_error(grade)
            grade = Check.grade_check(grade, job)
   
      uid = self.uid

      #根據職別建立不同實例化物件
      if job == "E":
            emp = Employee(name, job, year, grade, uid)
      elif job == "T":
            emp = Teamleader(name, job, year, grade, uid)
      elif job == "M":
            emp = Manager(name, job, year, grade, uid)

      
      self.members = emp #記錄到members字典
      
      print(f"輸入成功!姓名:{self.members.get(uid).name},工號:{self.members.get(uid).uid},薪資:{emp.salary()}")

      self.uid += 1 #輸入一次就改一次卡號

    def search_emp(self):
      search_opt = input("1.員工查詢;2.職位查詢")
      if search_opt == "1":
            uid = input("請輸入工號:")
            uid = Check.num_error(uid)

            while not self.members.get(uid):
                uid = int(input("該工號不存在,請重新輸入:"))

            else:
                print(f'''姓名:{self.members.get(uid).name}\n
                      職位:{self.members.get(uid).job}\n
                      級別:{self.members.get(uid).grade}\n
                      工齡:{self.members.get(uid).year}\n
                      薪資:{self.members.get(uid).salary()}\n''')


      elif search_opt == "2":
            total_value = self.members.values()
            job_input = input("請輸入職位:(E.普通員工;T.組長;M.經理)").upper()

            if job_input == "E":
                title = "普通員工"
            elif job_input == "T":
                title = "組長"
            elif job_input == "M":
                title = "經理"

            count = sum(1 for emp in self.members.values() if emp.job == job_input)

            if count:
                print(f"目前{title}共有{count}人:")
            else:
                print(f"目前公司沒有{title}!")

            for emp in self.members.values():
                if emp.job == job_input:
                  print(f"{emp.uid} - {emp.name}")

      else:
            ("輸入錯誤,請重新輸入")

    def up_downgrade(self):
      uid = input("請輸入工號:")
      uid = Check.num_error(uid)
      while not self.members.get(uid):
            uid = int(input("該工號不存在,請重新輸入:"))

      else:
            print(f'''{self.members.get(uid).name},
                      工號:{self.members.uid},
                      目前職位:{self.members.get(uid).job}{self.members.get(uid).grade}
                      目前薪資:{self.members.get(uid).salary()}''')
            
            while not grade_change:
                grade_change = input("請輸入需要變更的級數,降級請加上負號:")
                grade_change = Check.num_error(grade_change)

            else:
                grade = self.members.get(uid).grade + int(grade_change)
                job = self.members.get(uid).job
                job, grade = Check.updown_grade_check(job, grade)

                old_salary = self.members.get(uid).salary()

                self.members.get(uid).job = job
                self.members.get(uid).grade = grade
                print("調整成功!")

                new_salary = self.members.get(uid).salary()

                print(f'''{self.members.get(uid).name},
                      工號:{uid},
                      調整後職位:{self.members.get(uid).job}{self.members.get(uid).grade}
                      調整後薪資:{new_salary}({new_salary - old_salary})''')               
      



def main():
    f = Func()
    f.main_func()



GPT:

Check 類中的方法實際上不依賴於類的屬性,屬於純工具函數,適合作為靜態方法。

建議: 將 Check 類中的方法設為 @staticmethod,並修復 num_error 返回正確數字的問題。

class Check:
    @staticmethod
    def num_error(arg):
      try:
            return int(arg)
      except ValueError:
            print("請輸入正確的數字")
            return False


在主選單中,if ins == '3' or '4': 的判斷條件總是返回 True,因為 '4' 作為非空字串評估為真。

建議:

修改條件判斷為正確的形式,並加上 elif,避免執行多個不相關的分支。



year 和 grade 未初始化,會導致 while not year 報錯。

year, grade = None, None

grade_change 未初始化,while not grade_change 會報錯。

=================
if __name__ == "__main__":
    main()# 執行主程式入口

這樣加入後出現了UnboundLocalError:ins referenced before assignment


問題原因
在你的 main_func 方法中,這部分代碼有問題:

while ins != '5':
    ins = input("\n1.輸入資料;2.查詢資料;3.升級;4.降級;5.退出程式:")

這裡的 ins 是局部變數,但在 while 條件中先被引用,此時它尚未初始化。
這會導致 Python 嘗試在本地範圍內查找 ins,但找不到,因此報錯。
解決方案
在 main_func 方法中,先初始化變數 ins,例如:

ins = ""# 初始化變數,避免未賦值錯誤




目前在升降級時輸入id後會出現'dict' object has no attribute 'uid'

問題原因:self.members 是一個字典,並沒有屬性 uid。正確的做法應該是操作字典中對應的具體員工物件。



我想在輸入員工資料的地方加上防呆措施
      while True:
            job = input("職位(E.普通員工;T.組長;M.經理):").upper()
            if job != "E" and "T" and "M":
                print("輸入錯誤,請重新輸入!")
            else:
                break

但目前這樣寫即使輸入M也會不斷重複輸入錯誤
請問有什麼問題?

if job != "E" and "T" and "M":

在 Python 中,這段條件的解釋是:

job != "E" 是一個布林判斷,結果可能為 True 或 False。
"T" 和 "M" 是非空字串,在布林上下文中總是為 True。


所以條件實際上等價於:
if (job != "E") and True and True:

這導致無論 job 為何值,條件始終會被判定為 True。

正確解決方案
要檢查 job 是否不是 "E"、"T" 或 "M",應該使用括號或 not in 運算符。

解法 1:使用 not in
改寫為:

while True:
    job = input("職位(E.普通員工;T.組長;M.經理):").upper()
    if job not in ["E", "T", "M"]:
      print("輸入錯誤,請重新輸入!")
    else:
      break


解法 2:使用多重條件(不建議)
while True:
    job = input("職位(E.普通員工;T.組長;M.經理):").upper()
    if job != "E" and job != "T" and job != "M":
      print("輸入錯誤,請重新輸入!")
    else:
      break

為什麼推薦 not in
可讀性高:job not in ["E", "T", "M"] 直觀地表達了 job 是否不屬於該列表。
可擴展性高:如果將來需要檢查更多合法輸入,只需在列表中添加項目。

1. 工資計算的邏輯與職位不匹配
你在更新 job 和 grade 後,薪資計算依然沿用了之前的職位邏輯,而沒有使用正確的 salary() 方法。

在 Python 中,如果員工對象是 Employee,但更新為組長或經理時,對象的 salary() 方法仍然是 Employee 類的方法,而不是更新後職位的薪資計算邏輯。


self.members 中的對象類型沒有動態變更
在調整職位(升降/降級)時,job 變更了,但對應對象的類型並沒有改變。這會導致 salary() 方法仍然使用舊的類型邏輯。


解決方案
方法 1:根據 job 更新對象類型
當職位變更時,重新實例化對象,並替換 self.members 中的對象。



改:
class Employee:
    def __init__(self, name, job, year, grade, uid):
      self.name = name
      self.job = job
      self.grade = grade
      self.year = year
      self.uid = uid

   
    def get_uid(self):
      return self.uid
    def get_name(self):
      return self.name
    def get_job(self):
      return self.job
    def get_grade(self):
      return self.grade
    def get_year(self):
      return self.year
    def salary(self): #計算工資
      salary = 3000 + 500 * self.grade + 50 * self.year
      return salary


class Teamleader(Employee):
    def __init__(self, name, job, year, grade, uid):
      super().__init__(name, job, year, grade, uid)

    def salary(self):
      salary = 4000 + 800 * self.grade + 100 * self.year
      return salary

class Manager(Employee):
    def __init__(self, name, job, year, grade, uid):
      super().__init__(name, job, year, grade, uid)

    def salary(self):
      salary = 5000 + 1000 * (self.grade + self.year)
      return salary


class Check():
    def num_error(arg):
      try:
            return int(arg)
      except:
            print("請輸入正確的數字")
            return False
            
    def grade_check(grade, job):
      if job == "E":
            limit = 10
      elif job == "T":
            limit = 6
      elif job == "M":
            limit = 3
      
      if 0 < grade <= limit:
            return grade
      else:
            print(f"該職位最高級別為{limit},請重新輸入!")
            return False
   
    def updown_grade_check(job, grade):
      if job == "E":
            limit = 10
      elif job == "T":
            limit = 6
      elif job == "M":
            limit = 3
      
      if 0 < grade <= limit:
            return job, grade
      if grade > limit:
            if job == "E":
                job = "T"
            elif job == "T":
                job = "M"
            grade = 1
            return job, grade
      if 0 > grade:
            if job == "M":
                job = "T"
                grade = 6
            elif job == "T":
                job = "E"
                grade = 10
            return job, grade            
   
    def change_job(self, job, grade, uid):
      # 根據新職位重新創建對象
      if job == "E":
            self.members = Employee(
            name=self.members.name,
            job=job,
            year=self.members.year,
            grade=grade,
            uid=uid,
    )
      elif job == "T":
            self.members = Teamleader(
            name=self.members.name,
            job=job,
            year=self.members.year,
            grade=grade,
            uid=uid,
    )
      elif job == "M":
            self.members = Manager(
            name=self.members.name,
            job=job,
            year=self.members.year,
            grade=grade,
            uid=uid,
    )

class Func(Check):
    def __init__(self):
      self.members = {}
      self.uid = 10000

    # 程式功能入口
    def main_func(self):
      ins = ""
      while ins != '5':
            ins = input("\n1.輸入資料;2.查詢資料;3.升級;4.降級;5.退出程式:")
            if ins == '1':
                self.record_emp()
            elif ins == '2':
                if self.members == {}:
                  print("目前尚未輸入任何員工資料")
                else:
                  self.search_emp()
            elif ins == '3':
                if self.members == {}:
                  print("目前尚未輸入任何員工資料")
                else:
                  self.up_downgrade()            
            elif ins == '4':
                if self.members == {}:
                  print("目前尚未輸入任何員工資料")
                else:
                  self.up_downgrade()
            elif ins == '5':
                print("已退出員工管理系統")
            else:
                print("輸入錯誤,請重新輸入")


    def record_emp(self): #輸入員工資料
      name = input("姓名:")
      while True:
            job = input("職位(E.普通員工;T.組長;M.經理):").upper()
            if job not in ["E", "T", "M"]:
                print("輸入錯誤,請重新輸入!")
            else:
                break

      year, grade = None, None

      while not year:
            year = input("工齡:")
            year = Check.num_error(year)
      while not grade:
            grade = input("級別:")
            grade = Check.num_error(grade)
            grade = Check.grade_check(grade, job)
   
      uid = self.uid

      #根據職別建立不同實例化物件
      if job == "E":
            emp = Employee(name, job, year, grade, uid)
      elif job == "T":
            emp = Teamleader(name, job, year, grade, uid)
      elif job == "M":
            emp = Manager(name, job, year, grade, uid)

      
      self.members = emp #記錄到members字典
      
      print(f"輸入成功!姓名:{self.members.get(uid).name},工號:{self.members.get(uid).uid},薪資:{emp.salary()}")

      self.uid += 1 #輸入一次就改一次卡號

    def search_emp(self):
      search_opt = ""
      while not search_opt:
            search_opt = input("1.員工查詢;2.職位查詢:")
            if search_opt == "1":
                while not uid:
                  uid = input("請輸入工號:")
                  uid = Check.num_error(uid)

                  if not self.members.get(uid):
                     print("該工號不存在,請重新輸入:")

                  else:
                        print(f'姓名:{self.members.get(uid).name}\n'
                            f'職位:{self.members.get(uid).job}\n'
                            f'級別:{self.members.get(uid).grade}\n'
                            f'工齡:{self.members.get(uid).year}\n'
                            f'薪資:{self.members.get(uid).salary()}')
                        break


            elif search_opt == "2":
                job_input = input("請輸入職位(E.普通員工;T.組長;M.經理):").upper()

                if job_input == "E":
                  title = "普通員工"
                elif job_input == "T":
                  title = "組長"
                elif job_input == "M":
                  title = "經理"
                else:
                  print("輸入錯誤,請重新輸入")

                count = sum(1 for emp in self.members.values() if emp.job == job_input)

                if count:
                  print(f"目前{title}共有{count}人:")
                else:
                  print(f"目前公司沒有{title}!")

                for emp in self.members.values():
                  if emp.job == job_input:
                        print(f"{emp.uid} - {emp.name}")

            else:
                print("輸入錯誤,請重新輸入")
                break


    def up_downgrade(self):
      uid = ""
      while not uid:
            uid = input("請輸入工號:")
            uid = Check.num_error(uid)
            if not self.members.get(uid):
                print("該工號不存在,請重新輸入!")

            else:
                print(f'''{self.members.get(uid).name},工號:{uid},目前職位:{self.members.get(uid).job}{self.members.get(uid).grade},目前薪資:{self.members.get(uid).salary()}''')
                old_salary = self.members.get(uid).salary()

                grade_change = None
                while not grade_change:
                  grade_change = input("請輸入需要變更的級數,降級請加上負號:")
                  grade_change = Check.num_error(grade_change)

                else:
                  grade = self.members.get(uid).grade + int(grade_change)
                  job = self.members.get(uid).job
                  job, grade = Check.updown_grade_check(job, grade)

                  if job != self.members.get(uid).job:
                        self.change_job(job, grade, uid)

                  
                  new_salary = self.members.salary()
                  print("調整成功!")

                  new_salary = self.members.get(uid).salary()

                  print(f'{self.members.get(uid).name}\n'
                        f'工號:{uid}\n'
                        f'調整後職位:{self.members.get(uid).job}{self.members.get(uid).grade}\n'
                        f'調整後薪資:{new_salary}({new_salary - old_salary:+})\n')               
      


def main():
    f = Func()
    f.main_func()

if __name__ == "__main__":
    main()# 執行主程式入口



1. 修正 change_job 方法的作用域問題
目前,change_job 是 Check 類的方法,而 self.members 是 Func 類的屬性,因此 Check 方法中無法直接訪問 self.members。這會導致 AttributeError。

解決方案:
將 change_job 方法移動到 Func 類中,或者將 self.members 作為參數傳遞進入。

2. 防止未初始化變數的潛在錯誤
問題: uid 和 year 等變數在一些方法中可能未初始化
例如,在 search_emp 中,uid 和 search_opt 如果沒有初始化可能導致錯誤。


3. 精簡輸出,避免重複代碼
多處重複輸出的邏輯可以抽取到單獨的方法中,提升代碼可讀性和重用性。

新增方法 print_employee_info
def print_employee_info(self, uid):
    emp = self.members.get(uid)
    if emp:
      print(f'姓名:{emp.name}\n'
            f'職位:{emp.job}\n'
            f'級別:{emp.grade}\n'
            f'工齡:{emp.year}\n'
            f'薪資:{emp.salary()}')



最終:
class Employee:
    def __init__(self, name, job, year, grade, uid):
      self.name = name
      self.job = job
      self.grade = grade
      self.year = year
      self.uid = uid

   
    def get_uid(self):
      return self.uid
    def get_name(self):
      return self.name
    def get_job(self):
      return self.job
    def get_grade(self):
      return self.grade
    def get_year(self):
      return self.year
    def salary(self): #計算工資
      salary = 3000 + 500 * self.grade + 50 * self.year
      return salary


class Teamleader(Employee):
    def __init__(self, name, job, year, grade, uid):
      super().__init__(name, job, year, grade, uid)

    def salary(self):
      salary = 4000 + 800 * self.grade + 100 * self.year
      return salary

class Manager(Employee):
    def __init__(self, name, job, year, grade, uid):
      super().__init__(name, job, year, grade, uid)

    def salary(self):
      salary = 5000 + 1000 * (self.grade + self.year)
      return salary


class Check():
    def num_error(arg):
      try:
            return int(arg)
      except:
            print("請輸入正確的數字")
            return False
            
    def grade_check(grade, job):
      if job == "E":
            limit = 10
      elif job == "T":
            limit = 6
      elif job == "M":
            limit = 3
      
      if 0 < grade <= limit:
            return grade
      else:
            print(f"該職位最高級別為{limit},請重新輸入!")
            return False
   
    def updown_grade_check(job, grade):
      if job == "E":
            limit = 10
      elif job == "T":
            limit = 6
      elif job == "M":
            limit = 3
      
      if 0 < grade <= limit:
            return job, grade
      if grade > limit:
            if job == "E":
                job = "T"
            elif job == "T":
                job = "M"
            grade = 1
            return job, grade
      if 0 > grade:
            if job == "M":
                job = "T"
                grade = 6
            elif job == "T":
                job = "E"
                grade = 10
            return job, grade            
   


class Func(Check):
    def __init__(self):
      self.members = {}
      self.uid = 10000

    # 程式功能入口
    def main_func(self):
      ins = ""
      while ins != '5':
            ins = input("\n1.輸入資料;2.查詢資料;3.升級;4.降級;5.退出程式:")
            if ins == '1':
                self.record_emp()
            elif ins == '2':
                if self.members == {}:
                  print("目前尚未輸入任何員工資料")
                else:
                  self.search_emp()
            elif ins == '3':
                if self.members == {}:
                  print("目前尚未輸入任何員工資料")
                else:
                  self.up_downgrade()            
            elif ins == '4':
                if self.members == {}:
                  print("目前尚未輸入任何員工資料")
                else:
                  self.up_downgrade()
            elif ins == '5':
                print("已退出員工管理系統")
            else:
                print("輸入錯誤,請重新輸入")


    def record_emp(self): #輸入員工資料
      name = input("姓名:")
      while True:
            job = input("職位(E.普通員工;T.組長;M.經理):").upper()
            if job not in ["E", "T", "M"]:
                print("輸入錯誤,請重新輸入!")
            else:
                break

      year, grade = None, None

      while not year:
            year = input("工齡:")
            year = Check.num_error(year)
      while not grade:
            grade = input("級別:")
            grade = Check.num_error(grade)
            grade = Check.grade_check(grade, job)
   
      uid = self.uid

      #根據職別建立不同實例化物件
      if job == "E":
            emp = Employee(name, job, year, grade, uid)
      elif job == "T":
            emp = Teamleader(name, job, year, grade, uid)
      elif job == "M":
            emp = Manager(name, job, year, grade, uid)

      
      self.members = emp #記錄到members字典
      
      print(f"輸入成功!姓名:{self.members.get(uid).name},工號:{self.members.get(uid).uid},薪資:{emp.salary()}")

      self.uid += 1 #輸入一次就改一次卡號

    def search_emp(self):
      search_opt = None
      uid = None
      while not search_opt:
            search_opt = input("1.員工查詢;2.職位查詢:")
            if search_opt == "1":
                while not uid:
                  uid = input("請輸入工號:")
                  uid = Check.num_error(uid)

                  if not self.members.get(uid):
                     print("該工號不存在,請重新輸入:")

                  else:
                        print(f'姓名:{self.members.get(uid).name}\n'
                            f'職位:{self.members.get(uid).job}\n'
                            f'級別:{self.members.get(uid).grade}\n'
                            f'工齡:{self.members.get(uid).year}\n'
                            f'薪資:{self.members.get(uid).salary()}')
                        break


            elif search_opt == "2":
                job_input = input("請輸入職位(E.普通員工;T.組長;M.經理):").upper()

                if job_input == "E":
                  title = "普通員工"
                elif job_input == "T":
                  title = "組長"
                elif job_input == "M":
                  title = "經理"
                else:
                  print("輸入錯誤,請重新輸入")

                count = sum(1 for emp in self.members.values() if emp.job == job_input)

                if count:
                  print(f"目前{title}共有{count}人:")
                else:
                  print(f"目前公司沒有{title}!")

                for emp in self.members.values():
                  if emp.job == job_input:
                        print(f"{emp.uid} - {emp.name}")

            else:
                print("輸入錯誤,請重新輸入")
                break


    def up_downgrade(self):
      uid = None
      while not uid:
            uid = input("請輸入工號:")
            uid = Check.num_error(uid)
            if not self.members.get(uid):
                print("該工號不存在,請重新輸入!")

            else:
                print(f'''{self.members.get(uid).name},工號:{uid},目前職位:{self.members.get(uid).job}{self.members.get(uid).grade},目前薪資:{self.members.get(uid).salary()}''')
                old_salary = self.members.get(uid).salary()

                grade_change = None
                while not grade_change:
                  grade_change = input("請輸入需要變更的級數,降級請加上負號:")
                  grade_change = Check.num_error(grade_change)

                else:
                  grade = self.members.get(uid).grade + int(grade_change)
                  job = self.members.get(uid).job
                  job, grade = Check.updown_grade_check(job, grade)

                  if job != self.members.get(uid).job:
                        self.change_job(job, grade, uid)

                  
                  new_salary = self.members.salary()
                  print("調整成功!")

                  new_salary = self.members.get(uid).salary()

                  print(f'{self.members.get(uid).name}\n'
                        f'工號:{uid}\n'
                        f'調整後職位:{self.members.get(uid).job}{self.members.get(uid).grade}\n'
                        f'調整後薪資:{new_salary}({new_salary - old_salary:+})\n')               
      
    def change_job(self, job, grade, uid):
      # 根據新職位重新創建對象
      if job == "E":
            self.members = Employee(
            name=self.members.name,
            job=job,
            year=self.members.year,
            grade=grade,
            uid=uid,
    )
      elif job == "T":
            self.members = Teamleader(
            name=self.members.name,
            job=job,
            year=self.members.year,
            grade=grade,
            uid=uid,
    )
      elif job == "M":
            self.members = Manager(
            name=self.members.name,
            job=job,
            year=self.members.year,
            grade=grade,
            uid=uid,
    )

def main():
    f = Func()
    f.main_func()

if __name__ == "__main__":
    main()# 執行主程式入口

页: 6 7 8 9 10 11 12 13 14 15 [16] 17 18 19 20 21 22 23 24 25
查看完整版本: 第063讲:类和对象(VI)| 课后测试题及答案