【问题标题】:Python Class/Objects __str__ & other problems [duplicate]Python类/对象__str__和其他问题[重复]
【发布时间】:2019-04-28 17:08:07
【问题描述】:

仍然对 Python 非常陌生,并且正在为应该是一个简单的任务而苦苦挣扎。我必须为“Employee”类编写代码,保存模块,将模块导入另一个 .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 name 方法,因为我必须存储和显示的三个对象是预先确定的(没有用户输入或任何东西)。上述代码保存在名为 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

**这就是程序的结尾,就像我说的那样,应该是真的基本的东西,如果这是一个列表或其他东西,我可以将它淘汰np......但是每个员工必须存储为 Employee 类的对象。我们刚刚涵盖了一个非常长的关于类和对象的章节(当我患流感时),所以我的回忆/方法可能不是最好的。

【问题讨论】:

  • 您也可以发布您想要的输出吗?现在,当__str__ 必须返回字符串时,您的__str__ 确实返回元组("Name", "Susan Meyers", ...)。像这样更改 __str__ 的返回不会导致任何问题,因为它返回 single 字符串:return "Name: %s\nID Number: %s\nDepartment %s\nJob Title: %s" % (self.__name, self.__id, self.__dept, self.__title)
  • 在 Python 中你不需要 getter 和 setter,但是如果你的教授告诉你,你还是要写它们

标签: python python-3.x oop object


【解决方案1】:

错误在于 __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 在 cmets 中使用% 的解决方案也同样有效。

【讨论】:

  • 注意,op可能习惯用print(a,b,c)这种方式,可能不明白其中的区别
  • 这很清楚(显然),但您能否解释一下您使用的 .join([]) 方法和 {} 方法的作用?我知道我的 str 函数正在返回一个元组(但不完全是 为什么 它这样做,书中的示例以相同的方式编码工作正常......),但我不明白这两个您提供的使其返回元组的解决方案。我仍然是一个挣扎但坚定的学生,想尽可能多地学习,然后再学习一些。谢谢大佬!
  • @deHart 我已经澄清了我提供的示例,并附上了几个链接以供进一步参考。祝你学习顺利!
  • @TrebuchetMS:从心底里,谢谢你!这个问题快把我逼疯了。一旦你解释了逗号是问题所在,我意识到我可以简单地连接 (x+x+x) 来修复解决方案,而无需使用我不完全理解的代码。另外,我现在对另一门课程作业很感兴趣,但我会尽快查看这些链接。谢谢你的一切!
  • 字符串连接有效,因为它也会返回str。有很多方法可以解决这个问题,我只挑选了其中两个。 :-)
猜你喜欢
  • 2019-08-03
  • 1970-01-01
  • 2012-12-14
  • 2018-09-09
  • 2012-12-27
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多