django - `_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
在额外的步骤中定义单独的方法有什么好处?
解决方案
优点是,就像文档字符串说的(你也在你的问题中显示):
子类可以使用此钩子来使用标准 :cls:
Page
对象的替代方法。
如果我们只是想改变Page
类,我们覆盖_get_page()
但不需要在方法中重复构建top
和bottom
参数的整个逻辑page()
(DRY 原则)。
page()
仅当我们想更改其中计算的逻辑的某些部分时,我们才会覆盖该方法。
推荐阅读
- python - 使用 BeautifulSoup 编辑 DOCTYPE 标签
- html - 主页中的背景图像不起作用?
- python - 训练 Keras 序列模型时损失没有减少
- python - CSV 上传到数据库似乎不起作用
- python-3.x - 我如何在 python unittest mock 中使用 side_effect 测试除错误之外的错误?
- swift - 完成处理程序导致不调用 Deinit
- python-3.x - 如何查看两个不同元组列表中的元素是否匹配
- ag-grid - Ag-Grid onGridReady 没有获取参数?
- visual-studio - 添加 Nuget 包时,Visual Studio 2019“检索信息失败”
- angular - 如何从 Angular 上传 mp3 文件?