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

Python类方法原理探究:return cls(books)是否调用__init__方法?

类方法中cls(books)是否会调用Bookcase的__init__?

先贴出你的示例代码:

class Book:
    def __init__(self,title,author):
        self.title = title
        self.author = author
    def __str__(self):
        return '{} by {}'.format(self.title,self.author)
class Bookcase:
    def __init__(self,books=None):
        self.books = books
    @classmethod
    def create_bookcase(cls,book_list):
        books = []
        for title,author in book_list:
            books.append(Book(title,author))
        return cls(books)

直接给你答案:是的,完全会调用Bookcase的__init__方法。

这里的cls就是Bookcase类本身(类方法的第一个参数默认就是当前类),调用cls(books)和你直接写Bookcase(books)是一模一样的行为——Python在创建类实例时,会自动调用该类的__init__构造方法,把你传入的books参数传递给__init__的形参,完成实例属性的初始化。

如果你想直观验证,给Bookcase的__init__加个打印就行:

class Bookcase:
    def __init__(self,books=None):
        print("嘿,我是__init__,我被调用啦!")
        self.books = books
    # 其他代码不变

然后运行Bookcase.create_bookcase([("The Great Gatsby", "F. Scott Fitzgerald")]),你就能在控制台看到那行打印,实锤__init__被触发了。

另外多说一句:类方法里用cls而不是硬写Bookcase,是为了支持继承。比如如果有个SpecialBookcase继承自Bookcase,调用SpecialBookcase.create_bookcase()时,cls就会变成SpecialBookcase,返回的也是SpecialBookcase的实例,同时也会调用SpecialBookcase的__init__(如果它重写了的话),这让代码的复用性更强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:16:04