Python类/对象__str__和其他问题

时间:2018-11-27 01:38:40

标签: python python-3.x oop object

我对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类的对象。我们刚刚在有关类和对象的一章上写了很长的篇幅(我当时患上了流感),所以我的回忆/方法可能不是最好的。

1 个答案:

答案 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在注释中使用%的解决方案同样有效。