代码之家  ›  专栏  ›  技术社区  ›  Rob

正在生成此python员工程序的格式输出

  •  1
  • Rob  · 技术社区  · 7 年前

    我试图编写一个基本的员工程序来帮助我了解python是如何工作的。虽然,程序工作,但我试图获得的输出并不是我想要的。这是我到目前为止掌握的代码,它相当长,但我相信它相当直截了当:

    class Employee:
      def __init__(self, first, last, id, pay):
        self.first = first
        self.last = last
        self.id = id
        self.pay = pay
    
      def info(self):
        if isinstance(self, Supervisor):
          return print("Employee ID:", self.id, "\nFull name:", self.first, self.last, "\nSalary:", self.pay,
                       "\nEmployee's under supervision:", self.print_emp())
        elif isinstance(self, Developer):
          return print("Employee ID:", self.id, "\nFull name:", self.first, self.last, "\nSalary:", self.pay,
                       "\nPrograming Language:", self.prog_laung)
        else:
          return print("Employee ID:", self.id, "\nFull name:", self.first, self.last, "\nSalary:", self.pay)
    
    class Supervisor(Employee):
      def __init__(self, first, last, id, pay, emp_under_sup = None):
        super().__init__(first, last, id, pay)
        if emp_under_sup is None:
          self.emp_under_sup = []
        else:
          self.emp_under_sup = emp_under_sup
    
      def add_emp(self, emp):
        if emp not in self.emp_under_sup:
          self.emp_under_sup.append(emp)
    
      def print_emp(self):
        for emp in self.emp_under_sup:
          print(emp.first, emp.last)
    
    class Developer(Employee):
      def __init__(self, first, last, id, pay, prog_laung):
        super().__init__(first, last, id, pay)
        self.prog_laung = prog_laung
    
    sup1 = Supervisor('Jake', 'Derber', 1, 70000)
    sup1.info()
    print()
    dev1 = Developer('Rob', "M", 2, 60000, 'Python and Java')
    sup1.add_emp(dev1)
    sup1.info()
    

    上述代码产生的输出如下:

    Employee ID: 1
    Full name: Jake Derber 
    Salary: 70000 
    Employee's under supervision: None
    
    Rob M
    Employee ID: 1 
    Full name: Jake Derber 
    Salary: 70000 
    Employee's under supervision: None
    

    但是,我真正想要的输出是不同的。我试图生成的输出是:

    Employee ID: 1 
    Full name: Jake Derber 
    Salary: 70000 
    Employee's under supervision: None
    
    Employee ID: 1 
    Full name: Jake Derber 
    Salary: 70000 
    Employee's under supervision: Rob M
    

    我试过几种不同的方法。我确信我离这儿不远。如果有人能向我解释为什么输出不是我所期望的?我试过运行一个调试器,但我正在使用一个新的ide(pycharm),我无法同时显示我的输出和调试信息,所以这是没有帮助的。

    1 回复  |  直到 7 年前
        1
  •  1
  •   user3483203    7 年前

    当你打电话 return print(...) 在python中,调用 print 执行,调用 打印 被退回。然而, 打印 总是返回 None ,所以你回来了 是的。

    你在你的程序中做了好几次。

    您在输出中引用的特定问题来自以下行:

    print("Employee ID:", self.id, "\nFull name:", self.first, self.last, "\nSalary:", self.pay,
                   "\nEmployee's under supervision:", self.print_emp())
    

    在这一行,你打电话给 self.print_emp() ,它将被调用,函数的结果将与其他所有内容一起打印。

    功能 自我打印emp() 执行 首先,在这个函数中,您打印所有员工。这就是为什么员工会被打印在其他信息之上。

    然后函数 回报 ,这就是为什么 在最终输出中打印。

    以下是您正在经历的行为的最小示例:

    >>> def foo():
    ...     print('Hello World')
    
    >>> print('Testing: ', foo())
    Hello World
    Testing:  None
    

    若要修复此类行为,请使用 return 而不是 打印 以下内容:

    >>> def foo():
    ...    return 'Hello World'
    
    >>> print('Testing: ', foo())
    Testing:  Hello World
    

    或者在你的情况下,做一些类似的事情:

    def print_emp():
        return ', '.join([' '.join([emp.first, emp.last]) for emp in self.emp_under_sup])