OT Python3

Se ti interessa posta comandi e risultati e cerchiamo di capire.

E’ la flessibilita’ di Python.
Ti permette di fare un mucchio di cose … ma non e’ sempre facile capire cosa stai facendo. :slight_smile:
… Strano … mi ricorda un certo CAD … pardon, modellatore … :smile:

I linguaggi non sono piu’ quelli di una volta. :wink:
Ormai tutti fanno tutto.
Se vuoi imparare tutto il linguaggio prima di usarlo … mi sa che ti ci vorra’ una barca di tempo … :wink:
( Anche questo mi ricorda Rhino. :slight_smile: Io lo uso tutti i giorni, ma lo conoscero’ forse al 15 ~ 20 % :confused: )

def def1(argom1):
    print('stampa1')
    
class Class1:
    pass

Class1.metod1 = def1
class1 = Class1()
class1.metod1()

#################

def def2(argom2):
    print('stampa2')
    
class Class2:
    def __init__(self, param2=def2):
        self.attr2=param2

class2 = Class2()
class2.attr2('argomento2')

nel mio esempio (il secondo) come ho sempre visto fare, se nella funzione viene inserito un argomento
successivamente ti viene richiesto obbligatoriamente

nel tuo esempio (il primo) nella funzione viene inserito un argomento ma successivamente viene
escluso obbligo di tale richiesta non comprendo come mai

Emilio ti ringrazio dell’interessamento ho postato giusto il riepilogo sia del tuo esempio che del mio,
funzionano entrambi con la sola differenza che ho menzionato sopra

la cosa che ho capito la chiave del tuo esempio sta nel fatto che viene assegnata la funzione a ‘metod1’

ps forse è meglio non comprendere tutto adesso, il tempo darà le risposte al momento giusto

grazie come sempre

Il primo esempio mi sembra uguale a quanto scritto nel libro, quando definisce il metodo calcolaCalorie().
Non dimenticare che i metodi hanno ‘self’, a cui, quando tu richiami il metodo, Python assegna l’oggetto chiamante.
Nell’esempio ‘self’, che qui si chiama ‘argom1’ dovrebbe ricevere l’oggetto class1.

Per quanto mi riguarda, ho sempre bisogno di MOLTO tempo per ‘digerire’ la cose poco per volta … :slight_smile:

Ciao !

… mi fate venir mal di testa con l’uso delle classi in python! :joy::joy::rofl:
Non conoscendo il linguaggio python, se def1 è una la funzione, perchè definisci
la variabile argom1 se poi non viene utilizzato all’interno della funzione?

Ciao

Eeeeeeehi !
Ciao Sergio !

Vedi che Python serve a qualcosa, siamo riusciti a farti ricomparire sul forum ! :smile:

Quanto al parametro …
Di solito si usa il primo parametro per rappresentare l’oggetto con cui chiami il metodo.
Puo’ darsi che, se l’oggetto non ti serve, tu possa anche farne a meno …

Sono cose oltre le mie misere conoscenze da scriptomane.

Come dicevo a Salvio, si puo’ provare e vedere cosa succede … :slight_smile:

Ciao !

1 Mi Piace

ciao Sergio,
un pochino Emilio se ne è accorto che faccio molti intrugli con i codici
però sta volta tutto è nato da una sua risposta postando questo codice:

in pratica nel primo esempio (classico) di Emilio argomento del metodo è “self” come da manuale
nel secondo caso argomento della funzione esterna alla classe è “cane” senza obbligo di inserire argomento
nel mio caso “def2” viene inserita in __ init __ ed invece in questo caso ho l’obbligo di inserire argomento
da questa mi è sorta la domanda: come mai nella funzione esterna di Emilio non ha quest’obbligo?

giusto per fare una battuta questa volta la colpa non è mia ahahahah

1 Mi Piace

Ciao 0904!

La prima definizione è certamente la più chiara e compatta mentre la seconda sembra dire all’interprete
che c’è una classe Pippo che verrà implementata / costruita in runtime.

Ciao

Ciao Sergio!!!

1 Mi Piace

Ciao Sergio,
Ciao Emilio,

abbaia

forse è propria una regola, che una funzione richiamata da un metodo annulla l’obbligo dell’argomento mah…

Salvio.

def def2(arogm):
    print('stampa2')

class Class2:
    metod2 = def2

class2 = Class2()
class2.metod2()

questo modo ha lo stesso risultato a quello di Emilio

Prova a scrivere un codice che faccia riferimento all’argomento all’interno della funzione o del
metodo. Non avendo python installato posso presumere che l’interprete forzi il metodo inserendo
l’oggetto null (prova a far print di un argomento) oppure come primo argomento il riferimento stesso
della classe … Fai delle prove.
Oppure l’interprete è così intelligente da capire che la def2 è una istruzione banale come capita nella
maggior parte dei compilatori C++ (che te lo segnalano quasi a trattarti per scemo! :joy:)

Ciao

Grandissimo Giuseppe, è un piacere anche per me.
A presto
Sergio

che sia una cosa banale sono d’accordo
infatti la spiegazione è complicata

… basta far scrivere l’argomento. Tipo:
print (arogm)

Prova.

bisogna chiedere ad Emilio

Ma tu non stai provando con il compilatore???

Prova a modificare così e vedi cosa restituisce

def def2(argm):
print(arogm)

[Non so come formattare il codice]

def def2(argom):
    print(argom)

risultato: (<__ main __.Class2 object at 0x0240B430>)

Ciao ragazzi

Primo test:
definisco due funzioni nella classe:
una con un parametro, l’altra senza.

Quella senza parametro posso richiamarla solo con la classe.
Quella col parametro posso richiamarla solo con un oggetto.

class ben:

  def hi():
    print( 'HI' )

  def hello( self ):
    print( 'HELLO' )

ben1 = ben()

ben.hi()
ben1.hello()

risulta

python3 t.py
HI
HELLO

se gli dico

ben1.hi()

risulta

Traceback (most recent call last):
File “t.py”, line 13, in
ben1.hi()
TypeError: hi() takes 0 positional arguments but 1 was given

se gli dico

ben.hello()

risulta

Traceback (most recent call last):
File “t.py”, line 13, in
ben.hello()
TypeError: hello() missing 1 required positional argument: ‘self’

Secondo test:
Provo a passare delle funzioni al costruttore, come da prova di Salvio:

def esthi():
  print( 'HI' )

def esthello( self ):
  print( 'HELLO' )

class sam:
 
  def __init__( self, funhi, funhello ):
    self.hi = funhi
    self.hello = funhello

sam1 = sam( esthi, esthello )
sam1.hi()
sam1.hello( 0 )

risulta

HI
HELLO

e devo dare un parametro a hello(), se no da’ errore:

Traceback (most recent call last):
File “s.py”, line 15, in
sam1.hello()
TypeError: esthello() missing 1 required positional argument: ‘self’

Se pero’ provo a richiamare le funzioni come attributi della classe, da’ errore

sam.hello( 0 )
sam.hi()

Traceback (most recent call last):
File “s.py”, line 18, in
sam.hi()
AttributeError: type object ‘sam’ has no attribute ‘hi’

Traceback (most recent call last):
File “s.py”, line 17, in
sam.hello( 0 )
AttributeError: type object ‘sam’ has no attribute ‘hello’

A me pare che le funzioni che ‘attribuisci’ alla classe diventano metodi, per cui il primo parametro e’ riservato all’oggetto e le usi normalmente come metodi.

Quelle che ‘attribuisci’ a un oggetto sono delle funzioni normali,
che puoi richiamare dall’oggetto (essendo sui attributi), ma che la classe ignora completamente.

… Mi sembra che ci sia una logica … :slight_smile:
… O no ? :wink:

EDIT

Certo, nel primo test, posso richiamare il metodo dalla classe, ma devo dargli un parametro.
(Che dovrebbe essere un oggetto della classe, ma qui il metodo non lo usa … :wink: )

ben.hello( 0 )

cosi’ funziona anche

si Emilio puoi dargli un numero un testo o anche una stringa zero ‘’ a funzionare funziona

le diversità del funzionamento le avevo capite tra metodo e funzione ma la logica mi sfugge ancora :face_with_raised_eyebrow:

Emilio così non va bene, richiamare una funziona direttamente con la classe se ricordi è una mia esclusiva
mi si è detto che questo modo non va bene e poi si scopre che in questo caso è l’unica strada possibile
ragazzi quindi a questa cosa già ci ero arrivato tempo fa ahahahah ahahahah :rofl:

scusami se mi permetto Emilio ma forse non si tratta proprio di poterla richiamare solo con la classe

class ben:

  def hi():
    print( 'HI' )

  def hello( self ):
    print( 'HELLO' )

ben.hi()
ben.hello(1)
ben().hello()

ho tolto definitivamente istanza ‘ben1’ ed ho lavorato solo con la classe funzionano tutte
con la differenza che senza le parentesi della classe richiede argomento della funzione
mentre con le parentese nella classe obbligo dell’argomento viene bypassato :thinking:

in effeti bisogna tenere presente che quando si crea una istanza sono comprese già le parentesi:

ben1 = ben()

poco prima stavo pensando che era proprio il fatto di creare una istanza che permettesse questa cosa
mentre adesso facendo questa prova credo che l’enigma sta nella classe e di come viene usata
ho notato che senza argomento nella funzione l’unico modo come tuo esempio è questo: “ben.hi()”