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)
大家好。我试图理解类方法在上面的例子中是如何工作的。
当我们返回cls(书籍)时,是否会调用__init__方法 返回类书籍的实例(cls.books而不是 self.books)
或
返回cls(书籍)与使用init没有任何关系 方法和返回self.books?
答案 0 :(得分:1)
在create_bookcase
内,cls(books)
确实调用了__init__
方法。 *
但是,它调用__init__
的{{1}}方法,而不是cls
的{{1}}方法。
有什么区别?
__init__
现在,如果我致电Bookcase
,那么当class StoreBookcase(Bookcase):
def __init__(self, book_list, backstock=None):
super().__init__(book_list)
self.backstock = backstock if backstock else []
StoreBookcase.create_bookcase
cls(books)
为cls
时。
当然StoreBookcase
可能希望覆盖StoreBookcase
以获取可选的create_bookcase
参数。但是在子类中没有额外参数的情况下,或者当您对默认值感到满意时,您可以像这样使用基类backstock
。因此,classmethod
可用于为整个层次结构创建“备用构造函数”。
*从技术上讲,它调用classmethod
方法;只有在__new__
返回__init__
的实例时才会调用__new__
,当然如果您明确调用它。但是大多数类只使用cls
,它返回object.__new__
的实例,因此调用cls
。