我对Python还是很陌生,正在为应该做的简单工作苦苦挣扎。我必须为“雇员”类编写代码,保存模块,将模块导入另一个.py文件,然后存储和显示该类的3个对象。我不断收到
"TypeError: __str__ returned non-string (type tuple)"
无论我如何重新编写代码,这都使我发疯。如果我做错了任何事情,请告诉我怎么/为什么错了,学到这对我来说非常重要! 以下是Employee类的代码:
class Employee:
def __init__(self,name,id,dept,title):
self.__name = name
self.__id = id
self.__dept = dept
self.__title = title
def set_name(self,name):
self.__name = name
def set_id(self,id):
self.__id = id
def set_dept(self,dept):
self.__dept = dept
def set_title(self,title):
self.__title = title
def get_name(self):
return self.__name
def get_id(self):
return self.__id
def get_dept(self):
return self.__dept
def get_title(self):
return self.__title
def __str__(self):
return 'Name: ',self.__name,'\n','ID Number: ',str(self.__id),'\n','Department: ',self.__dept,'\n','Job Title: ',self.__title
我不确定我需要set和/或get名称方法,因为我必须存储和显示的三个对象是预先确定的(没有用户输入或任何东西)。前面的代码保存在名为emp.py的文件中。以下代码是我认为问题所在的位置,但是作为我不确定的新手。
import emp
def main():
name = 'Susan Meyers'
id = '47899'
dept = 'Accounting'
title = 'Vice President'
employee1 = emp.Employee(name,id,dept,title)
name = 'Mark Jones'
id = '39119'
dept = 'IT'
title = 'Programmer'
employee2 = emp.Employee(name,id,dept,title)
name = 'Joy Rogers'
id = '81774'
dept = 'Manufacturing'
title = 'Engineer'
employee3 = emp.Employee(name,id,dept,title)
print('Employee 1:')
print(employee1)
print('Employee 2:')
print(employee2)
print('Employee 3: ')
print(employee3)
main()
我已经通过创建一个对象(例如susan = emp.Employee ['Susan',id number,'dept','title'])并使用适当的信息(其中id,dept,title是,但仍然得到)来尝试了此操作元组错误。我在做什么错?我考虑过将信息存储在列表或字典中,但认为我应该坚持使用基本知识。我感到很愚蠢,我整天都在这里!所有帮助,谢谢。
编辑:修复了缩进错误(我在pycharm中的代码中不存在,但是在没有适当校对的情况下将其复制并粘贴到此处) 进一步编辑: 运行时,我需要说:
Employee 1:
Name: Susan Meyers
ID Number: 47899
Department: Accounting
Title: Vice President
Employee 2:
Name: Mark Jones
ID Number: 39119
Department: IT
Title: Programmer
Employee 3:
Name: Joy Rogers
ID Number: 81774
Department: Manufacturing
Title: Engineer
**这就是程序的结尾,就像我说的,应该是真正的基本内容,如果这是列表或其他内容,我可以将其淘汰掉……但是每个员工必须存储为Employee类的对象。我们刚刚在有关类和对象的一章上写了很长的篇幅(我当时患上了流感),所以我的回忆/方法可能不是最好的。
答案 0 :(得分:2)
__str__
方法本身存在错误
def __str__(self):
return 'Name: ',self.__name,'\n','ID Number: ',str(self.__id),'\n','Department: ',self.__dept,'\n','Job Title: ',self.__title
"TypeError: __str__ returned non-string (type tuple)"
此错误通知您
'Name: ',self.__name,'\n','ID Number: ',str(self.__id),'\n','Department: ',self.__dept,'\n','Job Title: ',self.__title
是 tuple
。 (这是隐式地用逗号分隔的符号构造的。)但是,Python期望将 str
作为返回类型。更改您的return语句,使其返回字符串。您可以使用
return ''.join(['Name: ',self.__name,'\n','ID Number: ',str(self.__id),'\n','Department: ',self.__dept,'\n','Job Title: ',self.__title])
或
return 'Name: {}\nID Number: {}\nDepartment: {}\nJob Title: {}'.format(self.__name, self.__id, self.__dept, self.__title)
或任何内容,只要它返回字符串即可。
编辑:澄清提供的解决方案
第一个解决方案使用.join()
方法,该方法遵循这种格式
<str_to_connect>.join(<iterable_of_str>)
使用['Name: ',self.__name, ... self.__title]
的方括号会将所有各种字符串参数打包到 list
中。将此列表传递到.join()
中会将其全部连接到一个str
中。
第二种解决方案使用.format()
方法,该方法遵循这种格式
<str_to_format>.format(<args>...)
您可以将复杂的格式传递到.format()
函数中,但是它们通常使用{}
占位符,然后使用传递的参数中的输入来填充它们。
最重要的是,这两个都将返回str
类型。
进一步阅读:str.join()
,PyFormat。
注意:C. Kim在注释中使用%
的解决方案同样有效。