pyFPDF实例化调用add_page()触发无state属性报错问题
问题根源
你之前推测的「用户输入获取逻辑与add_page()存在冲突」是完全错误的归因,报错和input()逻辑没有任何关系,是两处基础代码错误导致的:
- 自定义
PDF类重写__init__构造方法时,没有调用父类FPDF的构造方法。state是父类构造方法里初始化的核心实例属性,你跳过父类初始化直接写自己的构造逻辑,生成的实例自然不存在state属性,调用依赖该属性的add_page()时就会抛出属性不存在的错误。 - 调用实例方法
self.add_page()时多余传入了self参数。Python的实例方法在通过实例调用时会自动绑定当前实例作为第一个self参数,你手动再传入一个self,会导致参数错位,就算完成了父类初始化也会触发参数不匹配的报错。
修复方法
只需要修改两处代码即可:
- 在自定义类
__init__方法的最开头,调用父类构造方法完成核心属性初始化:super().__init__() - 删除
add_page()调用时多余传入的self参数,改为self.add_page(format='a4')
修复后的完整可运行代码如下:
from fpdf import FPDF class PDF(FPDF): def __init__(self, name): # 调用父类构造方法,初始化FPDF核心属性 super().__init__() if not name: raise ValueError("no name") self.name = name # 移除多余的self传参 self.add_page(format='a4') def header(self): self.image("shirtificate.png") self.ln(20) @classmethod def get_name(cls): name = input("Name: ") return cls(name) @property def name(self): return self._name @name.setter def name(self, name): if not name: raise ValueError("no name") self._name = name pdf = PDF.get_name() pdf.set_font("helvetica", "B", 16) pdf.output("shirtificate.pdf")
修复后不管是在类方法中通过input()获取用户输入,还是在__init__方法内调用add_page()都可以正常运行,不会再抛出属性错误。
内容的提问来源于stack exchange,提问作者user19417852
相关产品推荐
相关产品推荐

