首页 > 解决方案 > `_get_page` 实例化 Page 类

问题描述

我通过阅读 Django 源代码来学习编码风格:
在 pagination.py Pagination中,源代码定义了一个私有方法来实例化类 Page。

def page(self, number):
    """
    Returns a Page object for the given 1-based page number.
    """
    number = self.validate_number(number)
    bottom = (number - 1) * self.per_page
    top = bottom + self.per_page
    if top + self.orphans >= self.count:
        top = self.count
    return self._get_page(self.object_list[bottom:top], number, self)


def _get_page(self, *args, **kwargs):
    """
    Returns an instance of a single page.

    This hook can be used by subclasses to use an alternative to the
    standard :cls:`Page` object.
    """
    return Page(*args, **kwargs)

我认为如果使用方法页面将其实例化为

def page(self, number):
    """
    Returns a Page object for the given 1-based page number.
    """
    number = self.validate_number(number)
    bottom = (number - 1) * self.per_page
    top = bottom + self.per_page
    if top + self.orphans >= self.count:
        top = self.count
    return Page(self.object_list[bottom:top], number, self)

_get_page在额外的步骤中定义单独的方法有什么好处?

标签: django

解决方案


优点是,就像文档字符串说的(你也在你的问题中显示):

子类可以使用此钩子来使用标准 :cls:Page对象的替代方法。

如果我们只是想改变Page类,我们覆盖_get_page()但不需要在方法中重复构建topbottom参数的整个逻辑page()DRY 原则)。

page()仅当我们想更改其中计算的逻辑的某些部分时,我们才会覆盖该方法。


推荐阅读