OT Python3

Ciao Salvio !

Giusto ! :slight_smile:
( In Python di solito li chiamano ‘attributi’ in generale, nel particolare, questo e’ un ‘metodo’)

Beh … si’, direi che l’idea e’ quella.

Se intendi dire che richiamando il costruttore Cibo(), otteniamo un oggetto (pasta) con tutti gli attributi della classe Cibo…
Esatto. Credo che questa sia l’idea principale della OOP.

Occhio, costruendo l’oggetto pasta gli ‘passiamo’ tutti gli attributi, OK,
Ma richiamare poi il metodo o meno e’ una azione separata.

Se intendi dire che quando richiamiamo il metodo, richiamiamo la funzione definita fuori dalla classe, OK.

… Ma perche’ non provi a fare uno script che disegna un bel rettangolo, come fa di solito chi inizia a scriptare ? … No, eh !

:rofl::rofl: Scherzo !

Ciao !

eravamo rimasti che questa viene chiamata funzione mentre all’interno di una classe metodo giusto

si era questo il senso

mentre come hai chiarito proteine carboidrati grassi sono chiamati attributi anche calcolaCalorie che richiama l’omonima funzione esterna è sempre un attributo?

è un modo gentile per dirmi di darmi all’ippica ahahahah

Eh si’ … terminologia OOP … le funzioni ‘interne’ alla classe li chiamiamo ‘metodi’.

__init__(self, proteine=0, carboidrati=0, grassi=0, calcolaCalorie=calcolaCalorie):

Beh, tu puoi anche scriverlo cosi’ il costruttore, ma l’esempio del libro e’ un po’ diverso.

Non confondere i parametri del costruttore
(che qui sono: self, proteine, carboidrati, grassi, calcolaCalorie )
con gli attributi degli oggetti.
Gli attributi sono quelli che usi scrivendo un punto tra l’oggetto e l’attributo.
Ogni volta che scrivi, ad esempio

pasta.proteine

‘proteine’ e’ un attributo dell’ogggetto ‘pasta’.

Il costruttore serve a … costruire l’oggetto :wink: .
Quando scrivi:

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

tu richiami il costruttore con i parametri 12, 72, 1

Il fatto che i parametri abbiano i nomi degli attributi e che poi all’interno del costruttore i valori dei parametri siano assegnati agli attributi e’ solo un caso (anche se spesso si fa in questo modo)

Parametri del costruttore e attributi dell’oggetto sono cose separate.

Certo. E’ stato definito con questa istruzione:

Cibo.calcolaCalorie = calcolaCalorie

Tu dici giustamnte che calcolaCalorie() richiama una funzione esterna, ma questa e’ solo una informazione sulla ‘provenienza’ della funzione.
Alla classe non interessa da dove vengono i valori dei suoi attributi.
Lei sa solo che l’attributo ‘calcolaCalorie’ e’ un suo metodo.

… Almeno credo … :wink:

No, E’ un modo per dire che io del funzionamento di Python so ben poco … per cui posso benissimo dirti delle cavolate galattiche.
Soprattutto sulla programmazione ad oggetti …( non l’ho mai capita bene io per primo :smile: )

Mentre mi trovo piu’ a mio agio con i problemini geometrici degli script di Rhino. :slight_smile:

Ma se a te adesso interessano queste cose, nessun problema. :slight_smile:
Prendi solo con le molle quello che dico … :wink:

Ciao !

com’era la battuta in quel film: “non c’è la faccio più” ahahahah

come si fa a non confondersi se la cosa è un bel pò contorta

giusto per vedere se ho capito per lo meno la terminologia:

__init__ (self, param1=valor1, param2=valor2, param3=valor3)
self.attr1=param1
self.attr2=param2
self.attr3=param3

oppure:

__init__ (self, attr1=param1, attr1=param1, attr1=param1)
self.prop1=attr1
self.prop2=attr2
self.prop3=attr3

oppure nessuno dei due :slight_smile:

__init__ (self, param1=valor1, param2=valor2, param3=valor3):
  self.attr1=param1
  self.attr2=param2
  self.attr3=param3

:+1: :slight_smile:

Ma le due cose sono indipendenti.
Cioe’ nessuno ti obbliga a inizializzare degli attributi con i parametri del costruttore.

Tant’e’ che a volte il costruttore non ha parametri.
E l’oggetto puo’ anche non avere attributi (nel senso di valori). Potrebbero esserci solo dei metodi …
O la classe potrebbe servire solo per essere ereditata da altre classi … o … o …o … :smile:

attributi nel senso di valori cosa intendi?

come Cibo.proteine
Volevo dire numeri o testi o liste ecc. Ma non funzioni.

Non so come chiamarli in Python, forse c’e’ un nome … boh.
In altri linguaagi a volte si dice ‘campi’, per distiguerli dai ‘metodi’

senza “self.attr1=param1 etc etc” oppure inserire solo “self” come unico parametro nel costruttore
ovviamente questo lo ritenevo chiarito essendo che già all’inizio della discussione hai postato vari esempi

tipo questo esempio sarebbe più idoneo quindi:

__init__ (self, param1=valor1, param2=Metod1, param3=valor2):
  self.attr1=param1
  self.attr2=param2
  self.attr3=param3

Non voleva essere un’indicazione.

Dicevo solo che possono benissimo esserci classi senza campi, ma solo con metodi.
Come possono esserci tanti altri ‘tipi’ di classe.

… Scusa, idoneo per cosa ? :slight_smile:

idoneo nel senso che quando si inizializza un costruttore:
posso volendo specificare i parametri ed eventualmente ad esso assegnargli un valore oppure un metodo

tipo:

numeri testi liste = valori
funzioni = metodo

Sul fatto di assegnare un metodo tramite un parametro del costruttore … non saprei.
Forse si potrebbe fare una prova …

def def1():
    print(2*2)
    
class class1:
    def __init__(self, param1=def1):
        self.attr1=param1
        
class1().attr1()

dubbio tolto; funziona :slight_smile:

Ma se lo richiami da un oggetto, funziona ?

Tra l’altro vedo che non ha il parametro ‘sefl’ (o altro nome)

def def1():
    print(2*2)
    
class class1:
    def __init__(self, param1=def1):
        self.attr1=param1

pippo = class1()
pippo.attr1()

oggetto come pippo dici?

Si’ … blablabla … (Il nostro dio discourse qui vuole almeno 4 caratteri)

mo che mi ci fai pensare come mai nel tuo esempio:

class Pippo:
    pass

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

Pippo.abbaia = abbaia

pippo = Pippo()
pippo.abbaia()

la funzione contiene l’argomento ‘cane’ ma non c’è l’obbligo del requisito?

Scusa, non capisco …

class Pippo:
    pass

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

Pippo.abbaia = abbaia

pippo = Pippo()
pippo.abbaia()

nel tuo caso hai inserito la parola chiave ‘cane’ nella funzione solo quando l’hai dichiarata

def def1():
    print(2*2)
    
class class1:
    def __init__(self, param1=def1):
        self.attr1=param1

pippo = class1()
pippo.attr1()

mentre nel mio caso nella funzione non ho impostato nessuna parola chiave essendo
che se inserisco la parola chiave ‘cane’ sono obbligato poi ad inserire un argomento tipo:

def def1( cane ):
    print(2*2)
    
class class1:
    def __init__(self, param1=def1):
        self.attr1=param1

pippo = class1()
pippo.attr1("cane")

Eh … qui ormai sono al limite del poco che conosco di Python.
Io sono contento se riesco a far funzionare gli script per Rhino … :slight_smile:

Non so quanto valga, comuque …
nel caso in alto abbaia dovrebbe diventare un metodo, e’ la procedura che troviamo sul libro.

Nel secondo caso … non so cosa succeda.
Dato che la funzione non ha parametri (quindi nessun self), credo che tu non riesca ad usare gli attributi dell’oggetto all’interno nella funzione.
Ma tu potresti non averne bisogno …

Nel terzo … mi perdo definitivamente … :confused:

Certo, sono casi interessanti, bisognerebbe aver tempo di fare delle prove …

Hai provato a vedere cosa dice dir, applicandolo sia alla classe che all’oggetto,
nei vari casi ?

vabbè Emilio io mi fermo ho fatto delle prove come hai detto e mi escono valori bool o annotation
che non ho la minima idea di cosa indichi e come mai escono fuori questi risultati.

forse una cosa ho capito che sono settimane che mi sono impantanato su queste classi
sembra sempre di arrivare alla conclusione ma invece più ci si addentra e più ci si perde

mi vado a riposare e a breve cercherò di finire questo capitolo 8
eppure prima mi piaceva questo numero adesso non saprei :smile:

grazie sempre della pazienza a presto :ok_hand: