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
相关产品推荐
相关产品推荐

