我正在尝试编写一个基本的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),但我想不出如何同时显示输出和调试信息,因此它无济于事。
答案 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])