Topic: AttributeError: 'str' object has no attribute 'val' AIUTTTTOOO!!!  (Letto 165 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline matteo.bas

  • python unicellularis
  • *
  • Post: 1
  • Punti reputazione: 0
    • Mostra profilo

salve ragazzi premetto che non ho nessuna  esperienza di programmazione e sto preparando un esame all'università. mi stavo esercitando su classi, listelinkate e alberi... riporto uno script che sto facendo per esercitarmi ma non capisco perche mi da errore :AttributeError: 'str' object has no attribute 'val'......quando chiamole funzioni def stampa_lista(Lista) e nro_nodi(Lista).....ringrazio in anticipo per l'aiuto..

def main():
    g=Lista()
    l= Lista("w","e")
    print(l)
    #print(g)
    print(is_vuota(l))
    #print(is_vuota(g))
    print(nro_nodi(l))
    #print(nro_nodi(g))

class Lista():
    def __init__(self, val = None, next = None):
        self.val = val
        self.next = next

    def __repr__(self):
        return f"valore: {self.val}, prossimo: {self.next}"
       
###funzioni di utilità
def is_vuota(Lista):
    "ritorna True se la lista e vuota e False altrimenti"
    return Lista.val == None
         
def nro_nodi(Lista):
    "conta il numero di nodi"
    if is_vuota(Lista):
         return 0
    return 1 + nro_nodi(Lista.next)
def stampa_lista(Lista):
    if Lista == is_vuota(Lista):
        return 0
    else:
        print(Lista.val,stampa_lista(Lista.next))


if __name__ == "__main__":
    main()

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 435
  • Punti reputazione: 0
    • Mostra profilo
Re:AttributeError: 'str' object has no attribute 'val' AIUTTTTOOO!!!
« Risposta #1 il: Gennaio 17, 2021, 05:48 »
Ciao @matteo

premetto che non ho nessuna  esperienza di programmazione e sto preparando un esame all'università.
Ahi!

mi stavo esercitando su classi, listelinkate e alberi... riporto uno script che sto facendo per esercitarmi ma non capisco perche mi da errore :AttributeError: 'str' object has no attribute 'val'

Il discorso è semplice, quando Tu istanzi il Tuo oggetto Lista assegni "e" alla proprietà lista.next ed è e una stringa, tipo di oggetto che NON possiede la proprietà "val"

Python 3.8.5 (default, Jul 28 2020, 12:59:40)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license()" for more information.
>>> class Lista():
def __init__(self, val=None, next_e=None):
self.val = val
self.next = next_e
def __repr__(self):
return f'valore: {self.val}, prossimo: {self.next}'


>>> l = Lista('w', 'e')
>>> l
valore: w, prossimo: e
>>> type(l)
<class '__main__.Lista'>
>>> type(l.next)
<class 'str'>

P.S. : "next" è una funzione builtin di python, eviterei di usarlo quale nome di variabile

Confesso di NON essere un informatico, sono solo uno scarso autodidatta che sta cercando di apprendere python, ma stando a wikipedia una lista linkata sarebbe :
Citazione
In informatica, una lista concatenata (o linked list) è una struttura dati dinamica, tra quelle fondamentali usate nella programmazione. Consiste di una sequenza di nodi, ognuno contenente campi di dati arbitrari ed uno o due riferimenti ("link") che puntano al nodo successivo e/o precedente
... ora, cosa è l'oggetto "Lista()" da Te definito? ... sbaglierò ma così, ad orecchio, sembrerebbe che con esso Tu voglia definire un "nodo" costituente un elemento di una collezione di nodi; se così fosse la proprietà next dovrebbe puntare ad un oggetto "Lista" non ad una stringa ... abbisognerebbe, quindi, un insieme di oggetti "Lista" da referenziare, proviamo a definirne uno con il Tuo oggetto, magari che punti al Tuo nik-name
>>> nik = 'matteo.bas'
>>> linked_nik = [Lista(c) for c in nik]
>>> for i in range(len(linked_nik) -1):
linked_nik[i].next = linked_nik[i+1]


>>> linked_nik[0]
valore: m, prossimo: valore: a, prossimo: valore: t, prossimo: valore: t, prossimo: valore: e, prossimo: valore: o, prossimo: valore: ., prossimo: valore: b, prossimo: valore: a, prossimo: valore: s, prossimo: None
>>> linked_nik[6]
valore: ., prossimo: valore: b, prossimo: valore: a, prossimo: valore: s, prossimo: None
>>> type(linked_nik[0])
<class '__main__.Lista'>
>>> type(linked_nik[0].next)
<class '__main__.Lista'>
>>>

... sorprendente, vero? Ma un oggetto "Lista" è una linked list? ... qui entra in ballo la mia ignoranza, agli utenti più esperti la parola, come potremmo, comunque utilizzarlo, ad esempio per stampare il nick?, così?
>>> l = linked_nik[0]
>>> while not l.next == None:
print(l.val, end='')
l = l.next
else:
print(l.val)


matteo.bas
>>>


... discorso senz'altro da approfondire, e parecchio pure