【问题标题】:Issue with object programming and files对象编程和文件问题
【发布时间】:2022-01-16 13:54:12
【问题描述】:

我正在尝试编写代码并使用 pytest 进行检查。我以为我做的一切都很好,但我遇到了问题。写完之后,我想用 Person 类的方法来检查它。当我尝试使用方法 id 时,函数结束并得到输出:

 TypeError: 'str' object is not callable

我的代码:

class Person:
    def __init__(self, id, name, sex, birth_date):
        self.name = name
        self.id = id
        self.sex = sex
        self.birth_date = birth_date

    def __str__(self):
        return f'{self.name} born {self.birth_date} with {self.sex} has {self.id}'

    def name(self):
        return self.name

    def sex(self):
        return self.sex

    def id(self):
        return self.id

    def date_of_birth(self):
        return self.birth_date

def read_from_file(file_handle):
        people = []
        reader = csv.DictReader(file_handle)
        for row in reader:
            id = row['id']
            name = row['name']
            sex = row['sex']
            birth_date = row['birth_date']
            person = Person(id, name, sex, birth_date)
            print(person.id())[Error in this line]
            people.append(person)
        return people

def test_files():
    with open('people.txt', 'r') as people_txt:
        people = read_from_file(people_txt)

people.txt 行示例:

id,name,sex,birth_date

1,Doralyn Dovermann,Female,27/10/2005
2,Rickert Petschel,Male,10/7/2018
3,Whitney Girardoni,Female,7/3/1932

【问题讨论】:

  • 错误信息指向哪一行?
  • 请始终包含完整的 Traceback。将其格式化为代码。
  • 缺少行号,也只是一个提示:您将 id 作为函数,然后在构造函数中将属性变量定义为self.id,可能最好重命名其中一个以保留命名约定干净。
  • 它的工作原理是这样的,因为您正在实例化Person() 类并将所有方法与它一起传递到定义的person。可能会研究继承和 OOP 主题。
  • 您为方法使用的名称与用于它们应该返回的属性的名称相同。那是行不通的。像person.id 这样的属性查找只能找到属性方法,不能同时找到两者(实例属性优先)。为什么要编写这些方法并不明显(Python 中通常不使用 getter 方法)。

标签: python csv file object typeerror


【解决方案1】:

当您尝试像调用函数一样调用字符串时会发生该错误。在您的代码中,您调用person.id(),但person.id 不是函数。如果要打印字符串属性的内容,只需执行print(person.id)

【讨论】:

  • 抱歉打扰了,但我想确定我的工作。为什么方法 person.id() 不起作用。当我尝试调用类的方法时,我没有发现这样的错误。
  • @New_stud 再次阅读了他的答案;特别是“但 person.id 不是函数”-部分
  • 所以据我了解,一切都是因为函数名称?很抱歉,没想到问题不是很深。我专注于寻找小错误或类似的东西。
  • @New_stud 这是一个小错误,一个不应该出现的()。在名称末尾添加() 是告诉python 调用/执行该名称。字符串等基本对象无法执行。
猜你喜欢
  • 2022-01-08
  • 1970-01-01
  • 2011-01-23
  • 1970-01-01
  • 2020-10-18
  • 2017-07-05
  • 1970-01-01
  • 1970-01-01
  • 2011-10-10
相关资源
最近更新 更多