如何解决AttributeError: 'Pages'对象没有属性'pages'的报错
问题分析与解决
错误原因
Python中类的实例化流程是:先调用__new__创建类实例,再调用__init__对实例进行初始化(添加属性、赋值等)。你在__new__中创建实例后直接访问instance.pages,但此时__init__还未执行,pages属性根本没有被定义,因此抛出AttributeError。
修复方案
如果你希望调用Pages('123', [1, 2, 3, 4])直接返回pages列表,不需要保留Pages实例,可以直接在__new__中生成目标列表并返回,跳过__init__的执行(当__new__返回的不是当前类的实例时,Python不会调用__init__)。
修改后的完整代码如下:
from typing import List from typing_extensions import Self class Page: def __init__(self, search_id: str, page_num: int) -> None: self.search_id = search_id self.page_num = page_num self.isLast = False def mark_as_last(self): self.isLast = True class Pages: def __new__(cls: Self, search_id: str, range_of_pages: List[int]): # 直接调用静态方法生成pages列表并返回 return cls.create_pages(range_of_pages, search_id) @staticmethod def create_pages(range_of_pages: List[int], search_id: str) -> List[Page]: pages = [] for page_num in range_of_pages: page = Page(search_id, page_num) if page_num == range_of_pages[-1]: page.mark_as_last() pages.append(page) return pages
补充说明
如果你需要保留Pages实例的功能(比如原有的__getitem__方法),同时希望能获取pages列表,建议不要让构造器直接返回列表,而是通过实例属性访问:
class Pages: def __init__(self, search_id: str, range_of_pages: List[int]): self.search_id = search_id self.ranges_of_pages = range_of_pages self.pages = Pages.create_pages(self.ranges_of_pages, self.search_id) @staticmethod def create_pages(range_of_pages: List[int], search_id: str) -> List[Page]: pages = [] for page_num in range_of_pages: page = Page(search_id, page_num) if page_num == range_of_pages[-1]: page.mark_as_last() pages.append(page) return pages def __getitem__(self, item): return self.pages[item]
使用方式:
pages_instance = Pages('123', [1, 2, 3, 4]) pages_list = pages_instance.pages
内容的提问来源于stack exchange,提问作者prismo
相关产品推荐
相关产品推荐

