パイソン - ループ上の複数のインスタンス

gm_will:

私は、ランダムな簡単なPDFのを生成するには、以下のクラスを持っています。

from reportlab.pdfgen.canvas import Canvas
from reportlab.lib.pagesizes import letter
import random
import string
import os

BOOTH_NAME = [
        'Distrito', 'Sector', 'Residencia', 'Fraccionamiento',
        'Privado', 'Ciudad', 'Colonia', 'Departamentos',
        'Recinto', 'Barrio', 'Comuna', 'Vecindad'
    ]
BOOTH_CODE = list(string.ascii_uppercase)
ZONE_CODE = ['NORTE', 'OESTE', 'SUR', 'ESTE', 'SUROESTE', 'NOROESTE', 'SURESTE', 'NORESTE']
CONCEPT_NAME = ['COMPRA/VENTA', 'TESTIMONIO', 'ESCRITURAS']
WIDTH, HEIGHT = letter
DIR_NAME = '/Users/gmwill934/PycharmProjects/notarIA/pdfs/'

class PDF(object):
    def __init__(
            self,
            casilla=str(BOOTH_NAME[random.randint(0, len(BOOTH_NAME) - 1)]),
            clave_casilla=str(BOOTH_CODE[random.randint(0, len(BOOTH_CODE) - 1)]),
            zona=str(ZONE_CODE[random.randint(0, len(ZONE_CODE) - 1)]),
            concepto=str(CONCEPT_NAME[random.randint(0, len(CONCEPT_NAME) - 1)])
    ):
        self.casilla = casilla
        self.clave_casilla = clave_casilla
        self.zona = zona
        self.concepto = concepto
        self.name = '{} {} {}'.format(self.casilla, self.clave_casilla, self.zona)
        self.save_name = os.path.join(PDF.DIR_NAME, self.name+'.pdf')

    def create_pdf(self):
        pdf = Canvas(self.save_name, pagesize=letter)
        pdf.setTitle(self.name)
        pdf.grid([10, PDF.WIDTH - 10], [10, PDF.HEIGHT - 10])
        pdf.drawString(20, PDF.HEIGHT - 30, 'Numero de Casilla:')
        pdf.drawString(130, PDF.HEIGHT - 30, str(random.randint(1000, 9999)))
        pdf.drawString(20, PDF.HEIGHT - 50, 'Nombre de Casilla:')
        pdf.drawString(130, PDF.HEIGHT - 50, self.name)
        pdf.drawString(20, PDF.HEIGHT - 70, 'Numero de Votos:')
        pdf.drawString(130, PDF.HEIGHT - 70, str(random.randint(100000, 999999)))
        pdf.drawString(20, PDF.HEIGHT - 90, 'Concepto:')
        pdf.drawString(130, PDF.HEIGHT - 90, str(self.concepto))
        pdf.showPage()
        pdf.save()

基本的にはcreate_pdf方法は、PDFのランダムな値を持つが作成されます。

私は次のやりたいことは、複数のインスタンスを作成されPDF class、一度に複数のPDFファイルを作成します。

from src.pdf import PDF
# instantiate PDF class
# create multiple instances
pdf = PDF()
for n in range(10):
    pdf.create_pdf()

また、私はこれを試してみました。

from src.pdf import PDF
# instantiate PDF class
# create multiple instances
for n in range(10):
    pdf = PDF()
    pdf.create_pdf()

問題は、私はそれはその完成後1つのPDFの作成と思える10を期待していながら、それだけで1つだけのPDFファイルを作成することです。

この上の缶誰かのアドバイス?私何か不足していますか?

宝城チェ:

関数(メソッド)はときに評価パラメータのデフォルト値を定義
だからあなたのランダム生成ロジックは一度だけ実行されます。
やったほうがいい:

    def __init__(
            self,
            casilla=None,
            ...
    ):
        self.casilla = (
            casilla if casilla is not None else
            str(BOOTH_NAME[random.randint(0, len(BOOTH_NAME) - 1)]))
        ...

参照:https://docs.python.org/3/reference/compound_stmts.html#function-definitions

デフォルトのパラメータ値は、関数定義が実行されたときに、左から右に評価されます。関数が定義されているときに発現が、一度評価されること、および同じ「事前計算」値は、各コールに使用されていることを、この手段。これはデフォルトのパラメータは、リストや辞書などの変更可能なオブジェクトが、あるときに理解することが特に重要です:関数は(リストに項目を追加することによって、例えば)オブジェクトを変更する場合は、デフォルト値は実質的に変更されます。これは意図していたものを、一般的ではありません。これを回避する方法は、例えば、デフォルトとしてNoneを使用していない、と明示的に関数の本体で、それのためにテストすることです:

def whats_on_the_telly(penguin=None):
    if penguin is None:
        penguin = []
    penguin.append("property of the zoo")
    return penguin

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=21519&siteId=1