You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python创建Library类对象报错:TypeError: __init__()参数不匹配

问题解决与代码修正

你遇到的TypeError: __init__() takes 0 positional arguments but 1 was given错误,根源是Library类的__init__方法没有声明self参数——Python中所有实例方法的第一个参数必须是self(代表实例本身),创建实例时解释器会自动传入这个参数,缺少就会触发该错误。

除此之外,代码还有几处逻辑错误,下面是完整的修正方案:

1. 规范并修正Book类

按照Python编码规范,类名使用大驼峰命名法,修正后的代码如下:

class Book():
    def __init__(self, title="", author="", genre="", grade_level=0, pages=0):
        self.title = title
        self.author = author
        self.genre = genre
        self.grade_level = grade_level
        self.pages = pages

    def __str__(self):
        return f"The book {self.title} by {self.author} is a {self.genre} book for {self.grade_level} grade."

2. 修正Library类的核心错误

修复__init__、__str__和add方法的逻辑问题:

class Library():
    # 必须添加self参数,绑定实例属性
    def __init__(self):
        self.library = []

    # 支持批量添加书籍字典,或单个Book实例
    def add(self, item):
        if isinstance(item, list):
            # 遍历书籍字典列表,逐个创建Book实例存入图书馆
            for book_dict in item:
                self.library.append(Book(**book_dict))
        elif isinstance(item, Book):
            # 直接添加单个Book实例
            self.library.append(item)

    # __str__方法仅接受self参数,定义实例打印格式
    def __str__(self):
        temp = ""
        for book in self.library:
            temp += str(book) + "\n"
        # return放在循环外,返回所有书籍的拼接字符串,去掉末尾多余换行
        return temp.strip()

3. 修正调用代码

现在可以直接传入书籍列表,add方法会自动处理:

books = [
    {
        "title": "The Hunger Games",
        "author": "Suzanne Collins",
        "genre": "Science Fiction",
        "grade_level": 7,
        "pages": 374
    },
    {
        "title": "Harry Potter and the Sorcerer's Stone",
        "author": "J.K. Rowling",
        "genre": "Fantasy",
        "grade_level": 5,
        "pages": 309
    }]

my_library = Library()
my_library.add(books)
print(my_library)

关键错误点说明

  • __init__缺少self:这是Python类实例方法的强制要求,用于绑定实例自身的属性。
  • __str__额外加参数:该方法是Python内置特殊方法,仅允许self一个参数,用于定义实例被打印时的输出内容。
  • 循环逻辑错误:原代码将return放在循环内部,导致仅返回第一本书;同时错误地尝试用未定义的i创建对象,实际上图书馆列表中应存储Book实例,直接调用str(book)即可。
  • add方法适配性:原方法仅支持单个元素添加,修改后兼容批量添加字典列表的场景,匹配你的调用需求。

内容的提问来源于stack exchange,提问作者MartyMcFly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 21:20:44