la prova che intendevi era questa :
print(type(Class1().a))
<class ‘int’>
print(type(x.a))
<class ‘int’>
print(type(Class2().b))
<class ‘int’>
print(type(y.b))
<class ‘int’>
in questo caso sono tutti uguali.
la prova che intendevi era questa :
print(type(Class1().a))
<class ‘int’>
print(type(x.a))
<class ‘int’>
print(type(Class2().b))
<class ‘int’>
print(type(y.b))
<class ‘int’>
in questo caso sono tutti uguali.
Scusa, hai verificato che quei valori sono tutti numeri interi.
A cosa ti serve ?
Vuol dire che tu hai scritto , ad esempio
x.a = 10
Se scrivevi
x.a = 10.10
ti dava float invece che int
Stiamo parlando di classi e attributi o di tipi di dati ?
Quello che intendevo era questo
class cane:
zampe = 4
def conta( self ):
print( self.zampe )
bobi = cane()
bobi.conta()
# incidente stradale
bobi.zampe = 3
bobi.conta()
print( cane.zampe )
Cioe’ del fatto che gli attributi
cane.zampe
e
bobi.zampe
sono due cose diverse qui
certo fino a qui ci si era arrivati
Edit:
appunto dico esseno che si può istanziare la classe anche senza il costruttore init
diciamo che alla fine scegliere di usare init o meno e solo una preferenza personale
ma la differenza che io mi riferivo non era nel cambiare il valore nella classe o istanza ma usare init o meno
sto facendo delle prove ed a primo impatto se sono nella giusta strada posso cambiare il valore tramite classe o tramite istanza ma usando il costruttore init ogni volta “inizializza” i valori come impostati all’interno
OK. per quanto riguarda la istanze, anche a me sembra che sia lo stesso.
Credevo che parlassi della differenza tra attributo di classe e attributo di istanza.
Cosa intendi ? Di quale valore parli ?
lo stesso esempio che hai fatto prima:
puoi cambiare o solo il valore dell’istanza
oppure cambiare direttamente il valore nella classe
quello che sto provando con il metodo init dopo aver chiamato la classe se poi cambio il valore e richiamo la classe il metodo init ripristina comunque i valori impostati all’interno per lo meno questo sto notando.
Non riesco a capire … ma fa lo stesso…
Buona sperimentazione !
Eureka !
e anche questa volta avevi ragione tu
AH, OK … se lo dici tu (io ormai mi sono perso) …
ormai Emilio non sappiamo nemmeno più chi siamo ahahahah
ps giusto per romperti ancora le scatoline di sabato pomeriggio
ma è sbagliato dire qualora si usasse - in una classe - una definizione “usando la parola chiave self” -
che la parola chiave self richiamata dalla definizione è anch’essa un’istanza?
Non mi sembra sbagilato, di solito usiamo self per indicare un’istanza della classe (possiamo anche chiamarlo oggetto, se vogliamo, anziche’ istanza … )
… Anche se self non e’ una parola-chiave …
si hai ragione le parole chiavi sono altre in effetti
quindi ricapitolando :
se x=Class1() e Class1 chiama una funzione con self
è un’istanza che chiama un’altra istanza o oggetto come hai detto giusto?
puoi fare un esempio ?
nel senso che se self è un’istanza di classe
quando indico : x=Class1()
e x è anchessa un’istanza
in pratica quando scrivo : x.def1()
x (istanza) richiama la funzione def1 che contiene self (istanza)
è corretto?
se scrivi
x.def1()
il valore di x e’ quello che viene assegnato al parametro self di def1,
cioe’ x e’ il primo parametro (qui anche l’unico) che passi a def1
Credo sia come scrivere
Class1.def1( x )
… ma e’ meglio se fai una prova …
solo mozzarelle sono rimaste provole finite
meglio andare a vedere cosa fare tra poco va, per essere sabato abbiamo già dato tanto
alla prox Emilio e thank
Ciao !
class Class2:
def def2(self):
print(self.b + 1)
Class2.b = 20
print(Class2.b)
Class2().def2()
print(Class2().b)
il risultato ritorna prima 20 poi 21 infine 20
mah vedendo il risultato di questo esempio secondo me il tutto si riapre
Perche’ ?
Non ti risulta che 20 + 1 faccia 21 ?
certo che mi risulta che fa 21
questo codice conferma il fatto che la variabile di classe b e self.b sono la stessa identica cosa solo impostate con due modi diversi, che poi si creano 1000 istanza che prelevano il valore associato li ci si era arrivati.
in pratica da quello che ho costatato come già accennato ieri il metodo init riporta i valori iniziali come impostati al suo interno ogni qual volta si richiama la classe cosa che invece non avviene impostando una variabile
(quindi è questa la differenza tra usare l’uno o l’altro metodo)