Forum >> Principianti >> [RISOLTO] Mi aiutate a creare una sotto classe di XlsxWriter?

Pagina: 1

ho già scritto delle classi in passato, ma non ho molta esperienza nella creazione di una sotto classe già scritta, a parte qualche esempio basilare si intende. insomma, il mio scopo è quello di creare delle funzioni personalizzate specifiche per l'oggetto "Worksheet" definito nella libreria di XlsxWritere successivamente riutilizzarle nei miei script. un'idea di quello che vorrei fare lo potete trovare qua di seguito:
from xlsxwriter.worksheet import Worksheet
 
class WorksheetPlus(Worksheet):
    # funzione personalizzata:       
    def write_table(self, info, row, column):
        for dic in info:
            y = column
            for key in dic:
                self.write(row, y, dickey)
                y += 1
            row += 1
         
# codice per la verifica della sotto classe:
if __name__ == "__main__":
    from xlsxwriter.workbook import Workbook
    info = [{1:1, 2:2, 3:3, 4:4, 5:5}, {1:11, 2:22, 3:33, 4:444, 5:55}]
    obj_wb = Workbook("ciao.xlsx")
    obj_ws = obj_wb.add_worksheet("SHEET1")
    obj_ws.write_table(info, 0, 0) # questa istruzione non funziona..

il codice che vedere dovrebbe creare una tabella e ciò che deve essere scritto deve essere definito da una lista di dizionari, dove ogni dizionario è una linea della tabella. purtroppo però il codice non funziona, questo è il risultato:
λ python WorksheetPlus.py

Traceback (most recent call last):
File "WorksheetPlus.py", line 22, in <module>
obj_ws.write_table(info, 0, 0) # come mai non funziona?
AttributeError: 'Worksheet' object has no attribute 'write_table' <------------- !!!

come mai Python mi dice che l'oggetto "Worksheet" non ha attributi con il mio metodo personalizzato "write_table"? potete aiutarmi a capire come risolvere questo problema? probabilmente mi sfugge qualcosa di molto stupido.


--- Ultima modifica di TurboC in data 2020-05-04 05:08:34 ---

--- Ultima modifica di TurboC in data 2020-05-04 21:23:50 ---
come mai Python mi dice che l'oggetto "Worksheet" non ha attributi con il mio metodo personalizzato "write_table"? potete aiutarmi a capire come risolvere questo problema? probabilmente mi sfugge qualcosa di molto stupido.
Ciao a te, premetto non so nulla delle librerie che usi, ma mi sembra di vedere un problema evidente.

Dov'è l'istanza della classe WorksheetPlus che contiene il metodo write_table?

Rivedi la logica del tuo codice, ci sono delle cose che non tornano, ho il dubbio che non ti sia chiarissimo il concetto di ereditarietà.

Cya

ciao Daniele. guarda questo codice:
class SuperClasse:
    def SuperPrint(self, stringa):
        print(stringa*2)

class SottoClasse(SuperClasse):
    def CiaoPrint(self):
        print("ciao")

obj = SottoClasse()
obj.CiaoPrint()
obj.SuperPrint("hola")

questo è il risultato:
λ python test.py
ciao
holahola

l'oggetto "obj" della classe "SottoClasse" ha fatto uso sia di "CiaoPrint" che di "SuperPrint". SuperPrint è una funzione ereditata da "SuperClasse" ecco perché l'oggetto "obj" (un'istanza della classe "SottoClasse") può farne uso.


per me il concetto di ereditarietà si può riassumere in questo esempio, o c'è qualcosa che ho dimenticato? ora analizziamo quello che mi hai suggerito:
Dov'è l'istanza della classe WorksheetPlus che contiene il metodo write_table?

ottima osservazione! XlsxWriter è una libreria per la sola scrittura di file excel, e da quello che mi sembra di aver capito contiene diverse classi tra cui "Workbook" e "Worksheet". il primo identifica l'oggetto "file excel", il secondo invece identifica una scheda dell'oggetto "Workbook".

questa istruzione crea l'oggetto "file excel":
obj_wb = Workbook("ciao.xlsx")

quest'altra invece crea l'oggetto "foglio di calcolo" (di nome "SHEET1") del file excel appena creato:
obj_ws = obj_wb.add_worksheet("SHEET1")

ora, dov'è l'istanza della classe "WorksheetPlus"? eh non so.. è qua che non capisco. fammi pensare. il metodo "add_worksheet" della classe "Workbook" crea un oggetto "foglio di calcolo" che non proviene dalla mia classe personalizzata.. allora forse per raggiungere il mio scopo devo subclassare "Workbook" ed eseguire un override della funzione "add_worksheet(self, name)"? mm.. tu cosa ne pensi Daniele? come dovrei scrivere la mia sotto classe?


--- Ultima modifica di TurboC in data 2020-05-04 19:22:51 ---
ok ho risolto! grazie al cielo i programmatori della libreria hanno dedicato un articolo al "subclassing" delle classi "Workbook" e "Worksheet". potete trovare quello che vi occorre qua:


https://xlsxwriter.readthedocs.io/example_inheritance1.html



Pagina: 1



Esegui il login per scrivere una risposta.