Topic: [Risolto] Creazione di una Classe  (Letto 196 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline daniontheweb

  • python unicellularis
  • *
  • Post: 2
  • Punti reputazione: 0
    • Mostra profilo
[Risolto] Creazione di una Classe
« il: Aprile 15, 2023, 16:35 »
Buongiorno a tutti, sono ai primi passi della creazione di una classe, ho compilato questo basilare esercizio, il programma gira senza errori di compilazione, ma nella console di Spyder non visualizzo nulla. Non riesco a capire da dove derivi il problema.
Qualcosa saprebbe aiutarmi?
Python3

Allego codice:

class Umano:                               
    def __init__ (self,nome,età,altezza):   
        self.__nome=nome
        self.__età=età                     
        self.__altezza=altezza
       
        umano1=Umano("Angelo", 26, 1.84)

        print(umano1.nome)
        print(umano1.età)
        print(umano1.altezza)

In teoria dovrebbe farmi visualizzare le 3 caratteristiche nome età altezza, e invece non appare nulla.
« Ultima modifica: Aprile 16, 2023, 10:01 da daniontheweb »

Offline nuzzopippo

  • python sapiens
  • *****
  • Post: 677
  • Punti reputazione: 0
    • Mostra profilo
Re:Creazione di una Classe
« Risposta #1 il: Aprile 16, 2023, 07:41 »
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.
« Ultima modifica: Aprile 16, 2023, 07:51 da nuzzopippo »

Offline daniontheweb

  • python unicellularis
  • *
  • Post: 2
  • Punti reputazione: 0
    • Mostra profilo
Re:Creazione di una Classe
« Risposta #2 il: Aprile 16, 2023, 10:00 »
Grazie mille Nuzzopippo, sei stato chiarissimo. Sospettavo che il problema derivasse da una variabile privata, ma sono stato tratto in inganno dal fatto che ho preso questo esempio da un manuale che mi sto studiando, ma di tanto in tanto hanno commesso degli errori scrivendolo, secondo me. Adesso mi stampo anche le pagine del link che mi hai allegato e mi studio attentamente anche quelle, così approfondisco. Grazie ancora per la disponibilità. Daniele