You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

pyFPDF实例化调用add_page()触发无state属性报错问题

问题根源

你之前推测的「用户输入获取逻辑与add_page()存在冲突」是完全错误的归因,报错和input()逻辑没有任何关系,是两处基础代码错误导致的:

  • 自定义PDF类重写__init__构造方法时,没有调用父类FPDF的构造方法。state是父类构造方法里初始化的核心实例属性,你跳过父类初始化直接写自己的构造逻辑,生成的实例自然不存在state属性,调用依赖该属性的add_page()时就会抛出属性不存在的错误。
  • 调用实例方法self.add_page()时多余传入了self参数。Python的实例方法在通过实例调用时会自动绑定当前实例作为第一个self参数,你手动再传入一个self,会导致参数错位,就算完成了父类初始化也会触发参数不匹配的报错。
修复方法

只需要修改两处代码即可:

  1. 在自定义类__init__方法的最开头,调用父类构造方法完成核心属性初始化:super().__init__()
  2. 删除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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 06:45:31