簡體   English   中英

從類方法實例化時,pyFPDF .add_page() 函數中斷

[英]pyFPDF .add_page() function breaking when instantiating from classmethod

每當我嘗試在__init__()classmethod中獲取任何用戶輸入時, add_page()函數都會出錯。 當我沒有任何方法來獲取用戶輸入時,它工作正常,所以我認為它會以某種方式干擾。

AttributeError:“PDF”對象沒有屬性“狀態”。 您的意思是:“旋轉”嗎?

錯誤

Name: ttt
Traceback (most recent call last):
  File "/workspaces/106404228/shirtificate/shirtificate.py", line 63, in <module>
    pdf = PDF.get_name()
  File "/workspaces/106404228/shirtificate/shirtificate.py", line 44, in get_name
    return cls(name)
  File "/workspaces/106404228/shirtificate/shirtificate.py", line 32, in __init__
    self.add_page(self, format='a4')
  File "/home/ubuntu/.local/lib/python3.10/site-packages/fpdf/fpdf.py", line 813, in add_page
    if self.state == DocumentState.CLOSED:
AttributeError: 'PDF' object has no attribute 'state'. Did you mean: 'rotate'?

代碼

from fpdf import FPDF


class PDF(FPDF):

    def __init__(self, name):
        if not name:
            raise ValueError("no name")

        self.name = name
        self.add_page(self, format='a4')

    # header
    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")

這不是因為用戶輸入,而是因為您在FPDF對象尚未正確實例化時調用.add_page 您可以用硬編碼name替換用戶輸入,但您仍然會收到相同的錯誤。 classmethod 只是使問題更加明顯。

您可以從 Traceback 中看到發生的事情的順序:

  File "/workspaces/106404228/shirtificate/shirtificate.py", line 44, in get_name
    return cls(name)
  File "/workspaces/106404228/shirtificate/shirtificate.py", line 32, in __init__
    self.add_page(self, format='a4')

return cls(name)代碼將實例化FDPF對象,然后調用您的__init__ ,然后調用.add_page 但是.add_pageFDPF類的實例方法。 它應該在對象被實例化后被調用。 在您的代碼中,由於未調用父FPDF類的__init__ ,因此您的對象將缺少.stateFPDF對象的所有其他屬性,這會導致錯誤:

“PDF”對象沒有屬性“狀態”

您可以檢查FPDF類的__init__方法以了解它的作用。 如果您正在創建自定義子類,通常將父類的__init__稱為子類__init__的一部分。 (請參閱為什么不自動調用超類__init__方法? )。

解決方法是將您的代碼重新組織為如下所示:

from fpdf import FPDF

class PDF(FPDF):
    def __init__(self, name):
        if not name:
            raise ValueError("no name")

        # Call the parent FPDF init
        super().__init__()

        # Add your custom code after
        self.name = name
 
    ...

    @classmethod
    def get_name(cls):
        name = input("Name: ")
        # Create the object
        obj = cls(name)
        # Call FPDF object instance methods
        # after it is created to customize
        obj.add_page(format="A4")
        return obj

    ...

pdf = PDF.get_name()
pdf.set_font("helvetica", "B", 16)
pdf.output("shirtificate.pdf")

在這里,主要的變化是:

  1. 調用super().__init__()調用父級的__init__
  2. 實例化對象后調用.add_page

另一個建議的更改是重命名該類方法,因為它不僅僅是“獲取名稱”。 它應該被稱為create_from_namecreate_with_prompted_name

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM