无法理解类方法

时间:2018-03-17 02:11:00

标签: python

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?

1 个答案:

答案 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