Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
Python - Programmazione ad oggetti in Python
Forum - Python - Programmazione ad oggetti in Python

Avatar
davide94 (Member)
Rookie


Messaggi: 23
Iscritto: 09/11/2011

Segnala al moderatore
Postato alle 16:27
Mercoledì, 31/08/2016
Salve a tutti !
Avrei un problema in python di base.
Io ho una mia classe e gli ho ridefinito il metodo __str__ in modo che quando uso print invece di stamparmi il suo indirizzo mi stampa qualcosa di più utile come per esempio il nome.
Il problema è questo, quando faccio una lista e provo a stamparla per qualche motivo mi stampa di  nuovo gli indirizzi invece di usare il metodo che ho ridefinito.
Vorrei sapere il perchè di questo dato che mi sembra strano.
Codice sorgente - presumibilmente Python

  1. class Carta:
  2.     def __init__(self,name):
  3.         self._name=name
  4.     def getName(self):
  5.         return self._name
  6.     def __str__(self):
  7.         return self._name
  8. c1=Carta("A")
  9. c2=Carta("B")
  10. print(c1)
  11. print(c2)
  12. lista=[c1,c2]
  13. print(lista)



Inoltre volevo chiedervi conferma sull'utilizzo del self._ che mi sembra di aver capito serva per le variabili private.
Sinceramente trovo la oop in python abbastanza ostile e con poca documentazione e codice, quindi se aveste da consigliarmi qualche fonte ve ne sarei grato.


I bravi programmatori sanno cosa scrivere, i migliori sanno cosa riscrivere e riusare.
Eric Steven Raymond
PM Quote
Avatar
lumo (Member)
Expert


Messaggi: 413
Iscritto: 18/04/2010

Segnala al moderatore
Postato alle 18:52
Mercoledì, 31/08/2016
Da python3, __str__ si occupa della conversione dell'oggetto in stringa (quindi str(obj)) mentre il metodo per il pretty printing, cioè quello che ti serve, è __repr__(self)

Se vuoi che siano la stessa cosa, una tecnica comune è fare
Codice sorgente - presumibilmente Python

  1. def __repr__(self):
  2.     return str(self)



Riguardo alle variabili private, non esistono in python, però per convenzione si usa l'underscore davanti a quelle che lo sarebbero. C'è qualche informazione in più sul doppio underscore qui: https://docs.python.org/3/tutorial/classes.html#tut-private

Ultima modifica effettuata da lumo il 31/08/2016 alle 18:52
PM Quote
Avatar
davide94 (Member)
Rookie


Messaggi: 23
Iscritto: 09/11/2011

Segnala al moderatore
Postato alle 10:08
Venerdì, 02/09/2016
Grazie mille della risposta !

A questo punto mi chiedevo se fosse meglio fare la variabile "pubblica" oppure farla "privata"(con l'underscore quindi) e magari aggiungere un getName e un setName per l'accesso a tale variabile come si fa spesso in altri linguaggi oppure è considerata una cattiva pratica da fare in python ?

Sempre su questa linea mi chiedevo se creare classi astratte fosse da considerare in generale una cattiva pratica in python.
Infatti da quel che ho capito anche se non esiste in se una classe astratta si possono definire metodi astratti usando @abc.abstractmethod https://docs.python.org/2/library/abc.html.

Inoltre la distinzione tra interfaccia e classi è inesistente in python se ho capito giusto .
Spero di essere stato chiaro in ciò che volevo chiedere.


I bravi programmatori sanno cosa scrivere, i migliori sanno cosa riscrivere e riusare.
Eric Steven Raymond
PM Quote
Avatar
lumo (Member)
Expert


Messaggi: 413
Iscritto: 18/04/2010

Segnala al moderatore
Postato alle 13:10
Venerdì, 02/09/2016
Riguardo ai setters/getters, ti conviene usare il decoratore @property e @setter, qui viene spiegato abbastanza bene http://stackoverflow.com/questions/17330160/how-does-the-p ...

Se vuoi rimanere sul semplice, puoi anche usare dei setNome() normali, ma fallo solo se devi fare dei controlli particolari sul dato che ti viene passato (ad esempio l'intervallo numerico).
I getter non hanno molto senso visto che puoi fare obj.membro

Riguardo ai metodi astratti, puoi in effetti usare AbstractBaseClass, ma in python non l'ho mai usato. Il motivo è che il duck typing sostituisce effettivamente il bisogno per classi astratte e interfacce, al prezzo di perdere un po' di type safety.
E qui forse le cose sono cambiate perché adesso c'è l'optional typing in python, che però non ho ancora guardato quindi non saprei dirti.

Questo risponde anche alla tua domanda sulla differenza tra la classi e le interfacce.

PM Quote
Avatar
davide94 (Member)
Rookie


Messaggi: 23
Iscritto: 09/11/2011

Segnala al moderatore
Postato alle 16:10
Sabato, 03/09/2016
Grazie mille per la risposta e la tua disponibilità !
Ero molto indeciso su questi aspetti del linguaggio.


I bravi programmatori sanno cosa scrivere, i migliori sanno cosa riscrivere e riusare.
Eric Steven Raymond
PM Quote