""" 基础分页程序,处理分页计算,后续应当扩展其功能。 """ class Pagination: """ 分页程序。 """ def __init__(self, row_count: int): """ 初始化分页。 :param row_count: 总记录行数 """ self._offset = 0 """ 偏移量。 """ self._pages = -1 """ 总页数。 """ self._page_number = 1 """ 当前页码。 """ self.row_count = row_count """ 数据行数。 """ self.page_size = 20 """ 每页显示的数据量。默认 20 行每页。 """ @property def page_count(self): """ 取得页数。该属性必须在调用 :meth:`.pages` 方法后调用,例如:: >>> self.pages() >>> self.page_count :return: 页数 """ return self._pages @property def page_number(self): """ 取得当前页码。该属性必须在调用 :meth:`.number` 方法后调用, 例如:: >>> self.number(3) >>> self.page_number :return: 页码 """ return self._page_number @property def offset_size(self): """ 取得偏移量。 """ return self._offset def pages(self, page_size: int = 20): """ 计算页数。 :param page_size: 每页行数,必须处于 [1, 1000] 区间中。若不在此区间,则强制转换到此区间。默认每页 20 条。 :return: 计算取得的页数。 """ page_size = 1 if page_size < 1 else page_size page_size = 1000 if page_size > 1000 else page_size self.page_size = page_size if self.row_count == 0: self._pages = 1 else: _v1 = self.row_count / page_size _v2 = self.row_count // page_size self._pages = _v2 if _v1 == _v2 else _v2 + 1 return self._pages def number(self, page_number: int): """ 检查页码范围。 :param page_number: 页码 :return: 正确页码 """ _pages = self.pages(self.page_size) self._page_number = 1 if page_number < 1 else page_number self._page_number = _pages if self._page_number > _pages else self._page_number return self._page_number def offset(self, page_number: int): """ 偏移量。 :param page_number: 页码 :return: 偏移量 """ self._offset = self.page_size * (page_number - 1) return self._offset def paging(self, page_number: int = 1, page_size: int = 20): """ 分页计算,支持链式调用。 :params page_number 页码 :params page_size 每页显示的数量 :return self """ self.pages(page_size=page_size) self.offset(self.number(page_number)) return self