python - 难以理解类方法

标签 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)

大家好。我试图了解类方法在上面的以下情况中是如何工作的。

When we return cls(books), does the __init__ method get called to return an instance of the classes books (cls.books instead of self.books)

does returning cls(books) not have anything to do with using the init method and returning self.books?

最佳答案

内部create_bookcase , 那cls(books)确实调用了 __init__方法。*

但是,它调用了 __init__ cls的方法| , 而不是 __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) , 那clsStoreBookcase .

当然StoreBookcase可能想要覆盖 create_bookcase采取可选的backstock范围。但是在子类中没有额外参数的情况下,或者当您对默认值满意时,您可以只使用基类的 classmethod。像这样。所以,classmethod s 可用于为整个层次结构创建“替代构造函数”。


* 从技术上讲,它称为 __new__方法; __init__仅在 __new__ 时被调用返回 cls 的实例,或者当然,如果您明确调用它。但是大多数类只使用 object.__new__ , 它返回 cls 的一个实例, 所以 __init__被调用。

关于python - 难以理解类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49331856/

相关文章:

java - Jython 打印所有终端输出/将输出分配为字符串

python - 通过列表理解或映射加速 numpy 数组分配?

python - 在Python中绘制条形图

Python:如何从 xml 获取 namespace ?

python - 使用 Python 进行简单的远程进程监控

python - 使用 Pandas 读取包含一些缺失值的 CSV

python - Pandas,根据条件复制行

python - 如何检查列表中每一项的 'if condition'

python - 楼层划分和划分的运算符优先级

python - Yaml 转储 python 字典作为不带单引号的映射