OT Python3

Tranquillo … i database sono scritti con qualche linguaggio, forse non Python,
ma non vedo perche’ Python dovrebbe aver problemi a fare quello che fa un database …
magari in modo diverso e mettendoci piu’ tempo, OK.

C’e’ qualche operazione in particolare che ti ‘spaventa’ ? :wink:

modulo pickle

Non conosco pickle, ma certamente se il file lo scrivi con pickle, poi pickle e’ in grado di leggerlo
.
Se lo scrivi con altri mezzi … non so proprio.
… Salvo il buon vecchio metodo di cercare di capire il formato (meglio ancora recuperare la documentazione) e scriverti la routine per leggere il testo. :slight_smile:

Ho appena iniziato le ferie, per una ventina di giorni ( Porca m*rda ! … Solo 3 settimane ! :rage: )
sono tranquillo (io direi sono un libero cittadino :slight_smile: ), chiedi pure, poi se sapro’ risponderti qualcosa … si vedra’ … :rofl:

ahahahah ovviamente il mio tranquillo era per sottolineare la battuta che ti lasciavo in pace

elenco = ["2018/07/01","2018/07/02","2018/07/03","2018/07/04"]
for n in elenco:
    print(n.split("/")[2]+"/"+n.split("/")[1]+"/"+n.split("/")[0])

ho scritto una mezza cosa e direi che il meno è fatto adesso tocca tutto il resto :slight_smile:

1 Mi Piace

Help Emi :slight_smile:

sarà il caldo non saprei, ma o non riesco a comprendere o c’è qualche errore di fondo:

alla pag102 si parla della classe Verdura dove non c’è traccia del Metodo calorie ma essendo definito nella classe base Cibo la si può usare tranquillamente.

ma io di questo Metodo calorie non ne vedo l’ombra!
infatti continuando con la sezione “Le proprietà” digitando “melanzane.calorie e pasta.calorie” mi da errore mmmm :thinking:

se ho capito bene questo fatidico “metodo calorie” dovrebbe prendere il posto della funzione “calcolaCalorie” in entrambe le classi o per lo meno spero :smile:

Ciao Salvio

Io la classe Verdura ce l’ho a pagina 100, e nel successivo paragrafo Le Proprieta’, a pagina 101, viene definita la proprieta’ calorie.

Diciamo che con l’esempio che citi l’autore ha anticipato un pochino gil eventi … :smile:

Ti risulta ? :slight_smile:

ciao Emilio,

non saprei. stavo continuando ad andare avanti con la speranza che nel caso spiegasse come fare ma da quello che ho visto non mi sembra. io credo che la sua intenzione dovrebbe essere tipo questo esempio:

class aa:
    def bb():
        print(2+2)

aa.bb()
aa.cc = property(bb)
aa.cc

dove invece di richiamare la funzione tramite bb() assegna ad un nuovo metodo cc la funzione bb
per lo meno questo ho inteso da ciò che viene spiegato e mostrato poi che ha anticipato gli eventi
è uguale per me è tutto anticipato :smile: e per fortuna che questo libro era spiegato facile ahahahah

Cioe’ nel libro che hai tu dopo il paragrafo L’ereditarieta’ ( dove definisce e usa la classe Verdura ), non trovi il paragrafo Le proprieta’ ?

Scrivo qui quello che leggo io nel paragrafo Le proprieta’ alla quinta riga:

>>> Cibo.calorie = property(calcolaCalorie)
>>> melanzana.calorie
16.0
>>> pasta.calorie
345
>>>

OK, e’ proprio quello che dice Beri in quel paragrafo,
solo che l’attributo cc in questo caso si chiama proprieta’.
I metodi li richiami usando le parentesi, le proprieta’ senza parentesi.

Eh … questo non lo so … :slight_smile: … dimmelo tu.
Quando ho letto il libro, Python lo usavo gia’ ( non indaghiamo sul come … :smile: … Ne’ indaghiamo su come continuo ad usarlo :smile: )

A me i pregi del libro sembrano:

Costa poco ( … mi ricorda Rhino :wink: )
Non ha troppe pagine
Da’ parecchie informazioni
E’ in italiano (utile per chi non si trova con l’inglese)

Consente di concentrarsi su poche cose in modo da iniziare ad impratichirsi in poco tempo.
Volendo approfondire e capire meglio c’e’ moltissimo altro materiale ‘in giro’ … :slight_smile:

Inoltre ognuno ha il suo modo di imparare e quindi predilige certi strumenti anziche’ altri … :slight_smile:

esatto certo che c’è ed è proprio questo esempio che hai scritto che mi torna l’errore:

Cibo.calorie = property(calcolaCalorie)
NameError: name ‘calcolaCalorie’ is not defined

ma lo stesso esempio sintetizzato che io ho postato mi da anche lo stesso errore…
dov’è che si sbaglia?

Ah, OK, non avevo capito quale era l’errore.

Ma tu il metodo calcolaCalorie lo hai scritto ?
( qui ce l’ho nel paragrafo precedente: I metodi )

    def calcolaCalorie(self):
        return etc etc etc

certo che l’ho scritto, comunque credo di aver scoperto l’arcano:

prima della sezione “L’ereditarietà” alla fine del codice c’è questo stringa scritta che ho dovuto correggere:

libro > Cibo.calcolaCalorie = calcolaCalorie
corretto > calcolaCalorie = Cibo.calcolaCalorie

infatti adesso funziona non dovevo andare avanti per risolvere ma andare indietro ahahahah

ps mi sa che questo è uno di quei errori fatti di proposito dall’autore per testare il lettore ahahahah

ok thank Emilio della pazienza come sempre gentilissimo :+1:

EDIT:

da quello che ho visto dopo questa sezione viene il bello metodi privati, speciali e super
c’è da divertirsi eeee

… Strano. A me sembra giusta la prima riga … :confused:

Stai usando un interprete interattivo o un file ?

Con il file e’ semplice controllare, lo posti e vediamo subito. :slight_smile:

Se usi Python interattivamente … e’ piu’ difficile risalire a cosa e’ stato scritto e cosa no, e a come e’ stato scritto quello che e’ stato scritto … :smile:

Ciao !

non saprei leggendo la riga l’ho interpretata strana com’era scritta e andando a cambiarla il codice funziona;

in pratica è come se la sequenza fosse questa:
calcolaCalorie = Cibo.calcolaCalorie
Cibo.calorie = property(calcolaCalorie)

mentre con la prima sarebbe questa ma non va:
Cibo.calcolaCalorie = calcolaCalorie
Cibo.calorie = property(calcolaCalorie)

Se da’ questo errore vuol dire che la funzione calcolaCalorie non e’ stata definita.

Se posti un file da provare, vediamo in pratica cosa succede . :slight_smile:

ciao Emilio,

scusa l’attesa mi sono preso qualche giorno di stacco che mi servivano proprio :slight_smile:

si infatti come già postato ho dovuto invertire il codice all’inizio

questa dicitura:

con questa:

cosi funziona :+1:

13_classi.py (1,6 KB)

Ciao Salvio.
Perfetto !

Riporto qui la prima parte, per il famoso problema di calcolaCalorie

class Cibo:
    pass
pasta = Cibo()


# COSTRUTTORE / INIZIALIZZATORE
class Cibo:
    """un esempio di classe per gestire i cibi"""
    def __init__(self, proteine=0, carboidrati=0, grassi=0):
        self.proteine = proteine
        self.carboidrati = carboidrati
        self.grassi = grassi
    def calcolaCalorie(self):
        return(self.proteine * 4 + self.carboidrati * 4 + self.grassi * 9)
calcolaCalorie = Cibo.calcolaCalorie

Direi che c’e’ semplicemente una differenza tra quanto scritto nel libro e quanto hai scritto tu.
Ma mi sembra facile confondersi: dal libro la cosa non risulta poi cosi’ chiara … :confused:

Il libro definisce la funziona calcolaCalorie() come funzione ‘indipendente’, cioe’ la scrive fuori dalla classe.
Per cui, giustamente, per assegnarla come metodo alla classe, scrive

Cibo.calcolaCalorie = calcolaCalorie

Tu invece la definisci internamente alla classe, quindi esiste gia’ come metodo, mentre non esiste come funzione esterna alla classe.

Hai notato che questa istruzione

print(melanzane.calcolaCalorie())

funziona anche se togli la linea

calcolaCalorie = Cibo.calcolaCalorie

? :slight_smile:

Ciao Emilio, giusto per curiosità quale versione di Python usi ?

EDIT:

aspetta aspetta Emilio non ti confondere (se mi posso permettere)

si lo so che funziona anche togliendo quella stringa per questo il file che ho postato ha varie sezioni:
infatti “print(melanzane.calcolaCalorie())” fa rifermineto alla funzione “def calcolaCalorie” che a sua volta viene inglobata nella classe “Verdura” richiamando la classe base “Cibo”

mentre la stringa che ho invertito “calcolaCalorie = Cibo.calcolaCalorie” fa riferimento a
“Cibo.calorie = property(calcolaCalorie)” infatti se tolgo la stringa da te citata è questa che mi torna errore.

ps non mi risulta la stringa è interna alla classe, ho fatto anche una prova spostandola è funziona lo stesso

Perfetto. :slight_smile:

OK, perfetto di nuovo. … Solo, chiamiamola istruzione. Le stringhe sono un’altra cosa in Python. :wink:

Non parlavo dell’istruzione:

calcolaCalorie = Cibo.calcolaCalorie

Parlavo della funzione:

    def calcolaCalorie(self):
        return(self.proteine * 4 + self.carboidrati * 4 + self.grassi * 9)

che tu hai scritto come metodo della classe.
Mentre il libro la scrive come funzione esterna alla classe.

mmmmmmmmmmm :thinking:
non so adesso questo potrebbe essere una grana, nel senso che fin’ora si è detto che la parola chiave “self” serve a indicare la classe dichiarata, dove viene inserita all’interno delle parentesi del metodo annidato.

mentre a questo punto se il metodo diventa una funzione esterna alla classe, sono comunque obbligato a scriverlo sempre subito dopo la classe in cui i parametri sono riferiti? oppure può essere inserita dopo aver dichiarato vari classi e metodi con sempre parola chiave “self” e alla fine scrivendo la funzione riesce a capire che la suddetta funzione si riferisce alla classe prima o alla successiva o all’ultima?

Non conosco abbastanza questi particolari di Python,
( Di solito mi interesso di curve, superfici e cose del genere per gli script di Rhino :wink: )
ma credo che un metodo sia solo una funzione come le altre, salvo il fatto che quando e’ richiamata come metodo da un oggetto appartenente a una classe, Python ‘carica’ l’oggetto chiamante nel primo parametro della funzione.
Primo parametro che di solito chiamiamo ‘self’, ma questo a Python non interessa.
Se non sbaglio avevi gia’ fatto dei test al riguardo.

Essendo una funzione come le altre, tu la scrivi dove vuoi.
L’unica cosa che interessa a Python e’ se una funzione la scrivi dentro a fuori dalla classe.
Se la scirivi dentro e’ un metodo da subito.
Se la scrivi fuori dalla classe e’ una funzione normale, ma se vuoi la fai diventare anche un metodo in seguito.

Non e’ che il metodi diventi una funzione esterna.
Semplicemente nasce come funzione esterna, ma in seguito tu la ‘carichi’ nella classe come metodo.
( Ma la funzione esterna non sparisce, anche lei e’ sempre li’ … )

Python da solo non riesce a capire niente … :wink:
Sei tu che gli dici che quella funzione e’ anche un metodo della classe Cibo

Cibo.calcolaCalorie = calcolaCalorie

E’ solo questo lo scopo di questa istruzione, non serve ad altro.

Ad esempio, scrivere

class Pippo:
    def abbaia( self ):
        print( 'Bau Bau' )

pippo = Pippo()
pippo.abbaia()

Per quanto riguarda la classe Pippo, e’ uguale a scrivere

class Pippo:
    pass

def abbaia( cane ):
    print( 'Bau Bau' )

Pippo.abbaia = abbaia

pippo = Pippo()
pippo.abbaia()

… salvo errori od omissioni …
( Scritto al volo, senza testare. :confused:
Se vuoi provare tu, vedi se ti da’ qualche errore … )

Come ho detto altre volte, sono cose un po’ complesse.
Per capirle bisogna prima capire quelli che a me sembrano i concetti-base di Python:
cose come assegnazioni, passaggio di parametri, valori mutabili o non mutabili, oggetti e attributi …

Non so se il libro spiega bene queste cose, adesso non ricordo.
( Poi sapere anche un po’ di OOP non guasta … :wink: )

Python e’ molto flessibile, ti permette di fare un mucchio di cose …
Poi capire cosa hai scritto e’ tutta un’altra faccenda … :smile:

… Dovrei chiedere a Beri un rimiborso come ‘assistente aggiunto’ per il corso di Python …
:rofl:

beh Emilio adesso di una cosa sono sicuro di aver capito:
che quando credo di aver capito qualcosina, poi mi fai notare che non ho capito nulla ahahahah

battute a parte, vidiamo se riesco a sintetizzare:
sbaglio se dico che non creando il metodo ma una semplice funzione in questo caso “calcolaCalorie”
usando questa istruzione: Cibo.calcolaCalorie = calcolaCalorie
si aggiunge alla classe Cibo un parametro/proprietà (ora non ricordo il termine giusto) “calcolaCalorie”
che richiama la funzione omonima e qundi anche se vengono date queste istruzione come sugue:

pasta = Cibo(proteine=12, carboidrati=72, grassi=1)
Cibo.calcolaCalorie = calcolaCalorie
print(pasta.calcolaCalorie())

è come se ai parametri della classe fossero stati impostai in questo modo:
pasta = Cibo(proteine=12, carboidrati=72, grassi=1, calcolaCalorie=calcolaCalorie)
dove il quarto parametro richiama la funzione “calcolaCalorie”

dimmi tutto…