格式化我正在构建的此Python员工程序的输出

时间:2018-07-06 18:26:13

标签: python

我正在尝试编写一个基本的Employee程序来帮助我学习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 个答案:

答案 0 :(得分:1)

在Python中调用return print(...)时,将执行对print的调用,并返回对print的调用结果。但是,print始终返回None,因此您将返回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(),该调用将被调用,并且函数的结果将与其他所有内容一起打印。

函数self.print_emp()首先被执行 ,然后在此函数中打印所有员工。这就是为什么将员工打印在其余信息上方的原因。

该函数然后 返回 None,这就是在最终输出中打印None的原因。

这是您所遇到的行为的一个最小示例:

>>> def foo():
...     print('Hello World')

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

要解决此问题,请使用return代替print

>>> 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])