Ciao @Daniontheweb, ben venuto
... mi sa che hai un bel po' da leggere per acquisire l'argomento, in quelle poche righe di codice hai concentrato un bel po' di problematiche, tanto di tipo concettuale quanto di implementazione.
In primo luogo, una classe definisce struttura dati e metodi di un oggetto, non può essere instanziata dal suo interno, come apparentemente hai fatto Tu (N.B. usa il comando "pythoncode" dell'editor dei post per formattare il codice), tale operazione deve essere fatta "dall'esterno"
in secondo luogo, una volta instanziata (dall'esterno) puoi accedere alle variabili di istanza, o di classe, "se" dette variabili sono state definite : i Tuoi "print" riferiscono ad elementi tipo "umano1.nome", etc, non definiti nella classe che, invece, definisce "self.__nome", "nome" e "__nome" sono duce "cose" diverse.
... poi c'é un altro "particolare", utilizzando il doppio underscore ("__") nella definizione di una variabile stai, di fatto, definendo una "
variabile privata" della classe stessa, essa non sarà, di norma, direttamente accessibile, Te lo mostro
Python 3.10.6 (main, Mar 10 2023, 10:55:28) [GCC 11.3.0] on linux
Type "help", "copyright", "credits" or "license()" for more information.
class Umano:
def __init__(self, nome, eta, altezza):
self.__nome = nome
self.__eta = eta
self.__altezza = altezza
umano1 = Umano('Angelo', 26, 1.86)
print(umano1.__nome)
Traceback (most recent call last):
File "/usr/lib/python3.10/idlelib/run.py", line 578, in runcode
exec(code, self.locals)
File "<pyshell#7>", line 1, in <module>
AttributeError: 'Umano' object has no attribute '__nome'
Le motivazioni di tale "inconoscibilità" per __nome sono riportate nel link che Ti ho posto sulle variabili private.
Per tanto, potrei accedere ad una variabile di istanza se essa è posta in forma ordinaria
class Umano:
def __init__(self, nome, eta, altezza):
self.nome = nome
self.eta = eta
self.altezza = altezza
umano1 = Umano('Angelo', 26, 1.86)
print(umano1.nome)
Angelo
ovvero definendo una proprietà della classe che agisca coerentemente
class Umano:
def __init__(self, nome, eta, altezza):
self.__nome = nome
self.__eta = eta
self.__altezza = altezza
@property
def nome(self):
return self.__nome
umano1 = Umano('Angelo', 26, 1.86)
print(umano1.nome)
Angelo
print(umano1._Umano__nome)
Angelo
... le classi sono un pochino complesse, i capitoli relativi sul totorial in link, seppur numerosi non esauriscono l'argomento ma la loro lettura è un buon inizio.
Ciao
[Edit] : integrato l'ultimo esempio con l'utilizzo del "name mangling" (vedere il link) che non mi era venuto in mente di indicare in prima fase di stesura del post.