Topic: classi, attributi  (Letto 103 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline ele

  • python unicellularis
  • *
  • Post: 2
  • Punti reputazione: 0
    • Mostra profilo
classi, attributi
« il: Marzo 30, 2021, 22:36 »
Salve, premetto che i numeri che ho usato sono casuali, ho una classe cibo che contiene i valori di: proteine, carboidrati, e grassi di alimenti.
class cibo:
    def __init__(self,pr,ca,gr):
        self.pr=pr
        self.ca=ca
        self.gr=gr
#per immettere i valori degli alimenti uso:
olio=cibo(2,3,5)
pasta=cibo(5,7,3)

#per immettere i valori degli alimenti mi piacerebbe qualche cosa tipo ( mi da errore olio e pasta non sono definiti):
alimenti=(olio,2,3,5,pasta,5,7,3)

dovendo inserire parecchi alimenti mi piacerebbe poterli inserire in una lista o tupla per evitare di ripetere sempre il nome della classe e avere anche un elenco degli alimenti che ho inserito nella classe cibo.
Grazie

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 385
  • Punti reputazione: 0
    • Mostra profilo
Re:classi, attributi
« Risposta #1 il: Marzo 31, 2021, 07:39 »
beh ... anche il "nome" dell'alimento "potrebbe" essere un attributo della classe Cibo, non potrebbe andarti bene un qualcosa così?
>>> class Cibo:
def __init__(self, name, proteine, carboidrati, grassi):
self.name = name
self.proteine = proteine
self.carboidrati = carboidrati
self.grassi = grassi
def __str__(self):
return '%s : %d, %d, %d' % (self.name,
    self.proteine,
    self.carboidrati,
    self.grassi)


>>> alimenti = [Cibo('olio', 2, 3, 5),
    Cibo('pasta', 5, 3, 7)]
>>> for a in alimenti:
print(a)


olio : 2, 3, 5
pasta : 5, 3, 7
>>>

Le classi hanno una notevole plasticità, approfondisci l'argomento e poi valuta minuziosamente ciò che ti serve, quindi, struttura i dati secondo le necessità.

Offline ele

  • python unicellularis
  • *
  • Post: 2
  • Punti reputazione: 0
    • Mostra profilo
Re:classi, attributi
« Risposta #2 il: Marzo 31, 2021, 11:23 »
Grazie per la risposta, pero' ottengo solo la stampa degli attributi (e ti ringrazio per questo) ma i valori di olio o pasta non sono associati alla classe, se uso print(olio) ottengo NameError: name 'olio' is not defined mi serve anche di usare gli attributi per fare calcoli esempio olio.proteine e olio.carboidrati. Inoltre inserendo gli alimenti se possibile non ripetere sempre la parola Cibo. Comunque mi e' stato utili il tuo intervento specie per __str__ ti chiedo quindi gentilmente se puoi continuare ad aiutarmi. Grazie

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 385
  • Punti reputazione: 0
    • Mostra profilo
Re:classi, attributi
« Risposta #3 il: Marzo 31, 2021, 16:31 »
... Inoltre inserendo gli alimenti se possibile non ripetere sempre la parola Cibo....

Mi sa che una guardatina a classi e programmazione ad oggetti la "dovresti" dare @ele, quando le etichette "olio" o "pasta" siano "associate" alla Tua classe "Cibo" esse non fanno altro che definire nello spazio dei nomi delle variabili rappresentanti una istanza alla classe cibo, con le variabili di classe e di istanza correlate, non può utilizzarsi una classe senza che essa sia istanziata, perciò no, la parola "Cibo" non può essere eliminata, in un qualche momento dovrà essere necessariamente invocata.

Per altro puoi accedere tranquillamente alle proprietà dell'oggetto, un esempio, rappresentino i valori da Te definiti i valori per grammo, vogliamo calcolarli per un "piatto" con 100 grammi di pasta e 5 di olio i carboidrati:
>>> class Cibo:
def __init__(self, proteine, carboidrati, grassi):
self.proteine = proteine
self.carboidrati = carboidrati
self.grassi = grassi


>>> olio = Cibo(2, 3, 5)
>>> pasta = Cibo(5, 3, 7)
>>> print(olio.proteine)
2
>>> print(pasta.proteine)
5
>>> piatto = [(olio, 5), (pasta, 100)]
>>> print('Carboidrati nel piatto : %d' % (piatto[0][0].carboidrati * piatto[0][1] +
       piatto[1][0].carboidrati * piatto[1][1]))
Carboidrati nel piatto : 315
>>>

... maniera certamente pessima per utilizzare le classi ma, se fai i conti, i carboidrati saranno "giusti" .... il suggerimento è : studiati le classi

Per quanto riguarda lo "aiuto", non lo nego mai a nessuno ma di tempo ne ho poco (e poi io non sono un gran che e sto tutt'ora imparando), non sostituisco certo un buon libro ;)