OT Python3

Dov’e’ che richiami hi() con una istanza ?

nel mio ultimo esempio istanza non viene proprio creata, hi ed hello vengono richiamate dalla classe

nel tuo invece può sembrare che le parentesi stiano solo alla fine
mentre invece bisogna tenere presente delle parentesi di quando si crea istanza :

come nel mio ultimo esempio :

quindi credo che la chiave di esecuzione sta nel fatto di inserire o meno le parentesi alla classe (credo)

chissà se questo centri qualcosa?

The ‘bound’ means they are tied to an object, either the class object or the instance object. … If you pass the method itself as an argument, it no longer behaves like a method but a plain function.

Edit:

>>> Class0
<class '__main__.Class0'>
>>> Class0()
<__main__.Class0 object at 0x01F8ADB0>

di sicuro con o senza parentesi la cosa cambia

mah, forse ho fatto un passettino in avanti:

class Class0:
    def def0(argom1, argom2):
        print("stampa")

Class0.def0(1,2)
Class0().def0(3)

non’è che nel secondo modo bypassa gli argomenti, ma salta solo il primo argomento
forse si potrebbe ipotizzare che il secondo modo di richiamare la funzione
percepisce come primo parametro eventuale parola chiave ‘self’

mentre nel primo caso viene chiamata come funzione classica e quindi
eventuale parola chiave ‘self’ viene presa come argomento
quindi si potrebbe riassumere con questo esempio:

class Class0:
    def def0(self, argom1):
        print("stampa")

Class0.def0(1,2)
Class0().def0(3)

riepilogando :
nel primo caso accedo alla classe e richiamo normalmente
la funzione dove anche ‘self’ viene interpretato come argomento
mentre :
nel secondo caso viene richiamato il metodo della classe
e quindi la parola chiave ‘self’ che si riferisce alla classe
viene saltata e quindi richiede solo argom1 come argomento

ps se così fosse bisognerebbe capire quali complicanze ci potrebbero essere dietro
nel caso si andasse a richiamare normalmente una funzione all’interno di una classe
che contiene come primo parametro l’eventuale parola chiave ‘self’ se può dare problemi?

Ciao Salvio

Class0.def0(1,2)

Per quel che ne capisco, pensando secondo la programmazione in c++,
questa istruzione sembra fare una cosa molto brutta:
nella posizione di memoria 1 c’è un oggetto Class0 a cui devi far eseguire
il metodo def0 con argomento 2

def0 esegue un print perciò non capita nulla. Se invece def0 va a modificare
un attributo (ad esempio self.x=2, pensando ad un oggetto punto) stai modificando
alla cieca un frammento di memoria.

Ciao

Sergio

Bravo Emilio!

hai fatto un analisi chiara. Penso che le definizioni senza parametri
serva per definire metodi o attributi globali: la classe per si comporta
al pari di una libreria.

Ciao!

Sergio

Emilio non delude mai !

Ciao Sergio, grazie !

Giusto.

Anche se io volevo solo provare cosa succedeva con o senza il riferimento all’oggetto.
Non mi ero preoccupato del possibile utilizzo della funzione … :wink:

Credo che comunque avrei dovuto usare il decoratore staticmethod

Con il decoratore possiamo anche definire metodi statici con parametri,
e Python non si confonde su cosa assegnare al primo parametro … :slight_smile:

… Anche se a me tutte queste complicazioni da OOP fanno venire il mal di testa …:confused:
Anzi, gia’ reggo poco la OOP in generale …

Vedo che ti sei dato al C++ … che credo sia il massimo quanto a complicazioni … :smile:
Come ti trovi ?

Ciao !

Ciao Emilio

quando si naviga in OOP anche la programmazione in python diviene ostica
e la differenza con il C++ si riduce drasticamente. E se non si programma
spesso in OOP ogni volta è come ripartire da zero … :sweat_smile:
Ma peggio ancora, se avrai occasione, prova a leggere il codice delle
librerie Boost … :weary::weary::weary:
A confronto scrivere un plugin per rhino in c++ è come leggere un libro
di prima elementare! :joy::joy::rofl:

Ciao!

Io mi limito a usare le classi di RhinoCommon.
Evito accuratamente di scriverne di nuove, cosi’ non ho problemi … :smile:

Ho dato un’occhiata sul Web … interessante. Se ho capito lo scopo e’ di inglobarle poco per volta nella libreria standard.
Non ho visto il codice … forse dovrei scaricare tutta la baracca.
Non val la pena, tanto non ci capirei niente di sicuro.

Gia’ avevo faticato parecchi anni fa, quando avevo provato a ficcare il naso nel C++, che allora era giovane e semplice (per quanto possa essere semplice il C++ … :smile: )

Adesso e’ meglio che lasci perdere …

Se posso chiedere, tu ci fai dei plug-in per Rhino ?

Ciao !

No no Emilio …:sweat_smile:
Ho provato a scrivere qualcosina per capire i meccanismi ma quando la cosa è iniziata
a farsi complessa, il tempo misurato, le risposte di McNeel vaghe, ho desistito.

Ciao!

:rofl::rofl::rofl:

beh per la serie: mal comune, mezzo gaudio :slight_smile:
(ognuno a suo livello ovviamente)

è proprio vero a volte per alcuni percorsi è meglio non addentrarsi.

ps non me ne sono scappato dalla programmazione sto seguendo un metodo scientifico:
si dice che quando si riposa la parte irrazionale del cervello lavora meglio e quindi elabora di più
quindi la mia teoria entro in letargo un pò prima con l’augurio che al risveglio la mente ha elaborato tutto
ahahahah

cmq appena ci si addentra un pochino in Python è veramente tosta

lo so lo so alla fine rileggendo con calma erano le stesse cose che poi ho riportato successivamente ma spiegandomi meno tecnicamente da come aveva già fatto precedentemente Emilio
ovviamente se non facevo un pò di pratica al ragionamente mi era difficile arrivarci :slight_smile:

una domanda giusto per essere sicuro di una cosa, questi due esempi sono uguali del tutto :

class Class1:
    a=10
    def def1(self):
        print(self.a + 1)
x=Class1()
x.def1()
print(x.a)

print("")

class Class2:
    def __init__(self):
        self.b = 10
    def def2(self):
        print(self.b + 1)
y=Class2()
y.def2()
print(y.b)

nel senso che il costruttore init non aggiunge nulla in più ad una semplice variabile nella classe?

Ciao Salvio

Per quello che capisco io ( di queste tue acrobazie … :smile: ) …
La differenza dovrebbe essere che nel primo caso abbiamo una variabile unica appartenente alla classe.
Nel secondo, ogni istanza avra’ la sua variabile indipendente dalle altre.

…O intendevi altro ? …

(Con te non si sa mai dove vuoi andare a parare … :smile: )

ahahahah hai ragione, scusa se a volte insisto su certe cose ma è solo la foga di voler imparare concetti che a pensarci sono complessi da capire già normalmente solo che a volte lo si dimentica :scream:

questa volta parto neutro senza congetture :slight_smile:
un esempio di quello che hai detto sulla differenza dal primo e secondo esempio quale sarebbe?

ps anche se una cosa del genere forse l’hai già accennata evidentemente non mi è ancora chiaro

Beh, se non sbaglio, alla a della classe Class1, tu accedi con

Class1.a = 222

Dato che e’ un attributo della classe.
Quindi dato che di classi Class1 ce n’e’ una sola, anche il suo attributo a sara’ un singolo valore, no ?

Per la classe Class2, ogni istanza che costruisci avra’ il suo bell’attributo b
Dato che e’ un attributo dell’istanza, non della classe.

y1 = Class2()
y1.b = 111
y2 = Class2()
y2.b = 444

Esempio astratto:
C’e’ una cucciolata di gattini, usiamo la classe Gattino
e definiamo un suo attributo giorniDiVita
Poi costruiamo una istanza per ogni gattino
per le istanze definiamo un attributo nome

giorniDiVita e’ un valore unico riferito alla classe
nome e’ diverso per ogni gattino

E adesso l’esempio lo scrivi tu ! … :smile:
Cosi’ vediamo se funziona … :smile:

Se ti sembra un esempio cretino … giusto !
E’ per quello che non mi piace la OOP, ti costringe a contorcere concetti e ragionamenti per adattarli a uno schema fisso …
O a diventare matto per cercare esempi strampalati che si adattino a qualche bel concetto teorico “imposto dall’alto”. ( O scovato da Salvio … :rofl: )

Parlo di scrivere le classi.
Usare quelle delle librerie e’ piu’ semplice … non devi inventare niente. :slight_smile:

Emilio mi trovo con tutto quello che dici, ed per questo che ribadisco non dovrebbe essere lo stesso?

io ho creato una istanza con x e y sia con le rispettive Class1 e Class2

quindi come tuo esempio:

posso fare lo stesso con la x1=Class1() etc creando una nuova istanza ogni volta con x1.a etc o sbaglio?

Si’, lo avevo visto anch’io che possiamo fare questo, se intendi assegnare un valore a x1.a
Pero’ credo che in questo x1.a e Class1.a siano due variabiil diverse.
Se vuoi fai una prova

CIoe’ se tu non definisci nessun attributo di istanza, leggendo x1.a, leggi l’attributo di classe.
Se inveci definisci un attributo di istanza, allora dopo leggi quello.
… E’ un po’ un casino … bisogna provare. Adesso non ho tempo.
Se vuoi prova tu, se no piu’ tardi magari ci provo io …
Qui bisogna andare avanti poco per volta, testando per bene tutte le nostre ipotesi …
se no giriamo a vuoto . :slight_smile:

Occhio a non far confusione.
L’istanza e’ x
L’attributo e’ a