Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    47

    Python Estendere Classe dizionario

    Ciao a tutti, vi scrivo xchè ho una grande confusione mentale e da sl nn sn riuscito a porvi rimedio......sto facendo un corso su python che ho installato su ubuntu(mai usato linux prima). L'esercizio consiste nel creare una classe che estende il tipo dizionario affinchè la nuova classe mantenga l'ordine degli elementi inseriti in base alla chiave.
    Quindi sia che inserisca 5 elementi al momento della creazione si aggiungendoli a posteriori tali elementi devon esser ordinati in base alla chiave, se poi debbano essere effettivamente memorizzati in ordine in base alla chiave o semplicemente stampati in ordine quando stampo il dizionario nn è ben chiaro ne specificato, ma penso salvati anche in ordine.....

    Ad ogni modo questo esercizio che nn so come fare mi ha fatto venire in mente mille dubbi. Finora avevo esteso solo classi fatte da me di cui conosco il codice, esempio: creo la classe persona e la estendo cn Impiegato ecc....e fin qui ok xchè sapendo come è fatta la prima so come modificare il costruttore nella seconda ad esempio.In questo caso invece devo estendere una classe di python, e da qui i miei dubbi:

    1)Della classe dict non conosco il codice, quind nn so cosa fa ne come, se dovessi sl aggiungere dei metodi nuovi nn ci sarebbe problema ma se voglio ad esempio modificare il costruttore o altri metodi già fatti devo sapere il codice degli originali x integrare il mio, giusto? o posso farlo anche senza saperlo??

    2)In linux dove stanno effettivamente i codici sorgenti di python, e in questo caso dove trovo la classe dict per vedere come è fatta? In java era tanto semplice, c'eran le api online, ti diceva in che pacchetto stava la tua classe e ti guardavi il codice, nella doc online di python invece nn trovo na mazza e su linux nn mi oriento.

    3) L'esercizio che dovrei fare è difficile? Nel senso è complicato o lo è sl per me? Seuggerimenti su come farlo......grazie a tutti

  2. #2
    L'esercizio non dovrebbe essere molto difficile. Deriva una classe da dict e utilizza il metodo bisect per tenere sempre ordinate le chiavi.


    la classe dict
    http://docs.python.org/library/stdty...ing-types-dict

    creare una classe derivata di un tipo built-in
    http://www.python.org/download/relea...o/#subclassing

    modulo bisect
    http://docs.python.org/library/bisec...#module-bisect



    edit: potresti postare il testo dell'esercizio per intero?

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    47
    Python's dictionaries do not preserve the order of inserted data nor store the data sorted by the key. Write an extension for the dict class whose instances will keep the data sorted by their key value. Note that the order must be preserved also when new elements are added.


    Questo è il testo, adesso mi leggo i link che mi hai postato e cercho di capire come fare l'esercizio, l'unica cosa che continua nn capire è dove si trovan i sorgenti di python. Se volessi vedere il codice cn cui è implementata la classe dict, dove lo trovo, in che cartella di linux sta?
    A volte effettivamente nn serve sapere come è fatta una classe, se so che il costrutttore di una classe richiede 3 parametri e io ne voglio fare una sottoclase che prende un quarto, basta richiamare il costruttore della prima e poi aggiungere una variabile.......ma in certi casi senza vedere il codice nn è possibile creare una sottoclasse. Nel senso il costruttore di dict creerà un struttura dati, e gli altri medoti della classe lavorano supponendo che tale struttura è fatta in un certo modo, se modifico nella mia sottoclasse il costruttore del dizionario creando una lista di tuple a quel punto ordinarla sarà semplicissimo ma nn funzionerà più niente xchè gli altri metodi nn sn fatti per lavorare su quel tipo di dati......o sbaglio qualcosa nel mio ragionamento

  4. #4
    i sorgenti di solito sono in /usr/lib/python2.6 (dipende da dove li hai installati e dalla versione di python ovviamente).
    Non so dirti però in che file è definita la classe dict, mi spiace


  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    47
    Tra le info che mi hai dato te e quelle di altri forum sto iniziando a farmi un idea di come risolvere il tutto.

    La mia idea è questa. Nella mia sottoclasse ci sn dei metodi che van modificati, e pensavo di fare così. Quando creo un dizionario utilizzo il costruttore della sopraclasse e in più creo una lista di tutte le chiavi e utilizzo il metodo sort delle liste per ordinarla. Quando devo stampare la lista seguo l'ordine delle chiavi nella mia lista e ritrovo i corrispettivi valori nel diz....chiaro che devo modificare anche i metodi che modificano la lista a posteriori ecc.........in tutta onestà però se mi mette un es così all'esame sn panato xchè li nn ho internet quindi senza tutto il materiale che ho consultato mi sarebbe stato impossibile.....l'unico sito che potrò consultare è la doc ufficiale di python.


    Ad ogni modo mi resta ancora un dubbio....ho capito che nn mi serve abdare a vedere il codice originale della classe dict(che tra l'altro ho scoperto esser quasi introvabile) però se nella mia sottoclasse modifico dei metodi devo per lo meno sapere la firma di tali metodi.
    Ovvero se nella versione 3.1 di python(xchè mi sa che dict è cambiato rispetto alla 2.2 es) il metodi init di dict ha questa firma

    def __init__(self, *args, **kw):

    io devo conoscerla per poter riscrivere il metodo, xchè se io lo modifico con una altra firma che nn prende args ecc nn funzionerà.....come faccioa a conoscere i dati in input ai vari metodi? Xchè se faccio help(dict) mi dice che metodi ha la classse ma nn i parametri da passargli, e anche nella doc online di dict nn lo dice, o meglio lo dice sl per qualche metodo ma nn c'è ad esempio __init__ o __setitem___ ecc......

    http://docs.python.org/library/stdty...ing-types-dict

    come mai mancano.....

  6. #6
    ok, scusami ma ieri ero un pò stanco e mi sono totalmente dimenticato di pydoc.
    Da console, digita pydoc -p portaqualsiasi (ad esempio pydoc -p 3000)
    Dal browser, vai alla pagina localhost:3000
    Nella sezione Built-in modules, visita la pagina __builtin__. Lì dovrebbe esserci quello che ti serve.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.