Oppure

Loading
31/08/16 14:27
davide94
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.
class Carta:
    def __init__(self,name):
        self._name=name
    def getName(self):
        return self._name
    def __str__(self):
        return self._name
c1=Carta("A")
c2=Carta("B")
print(c1)
print(c2)
lista=[c1,c2]
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.
aaa
31/08/16 16:52
lumo
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
def __repr__(self):
    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: docs.python.org/3/tutorial/…
Ultima modifica effettuata da lumo 31/08/16 16:52
aaa
02/09/16 8:08
davide94
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 docs.python.org/2/library/….

Inoltre la distinzione tra interfaccia e classi è inesistente in python se ho capito giusto .
Spero di essere stato chiaro in ciò che volevo chiedere.
aaa
02/09/16 11:10
lumo
Riguardo ai setters/getters, ti conviene usare il decoratore @property e @setter, qui viene spiegato abbastanza bene stackoverflow.com/questions/17330160/…

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.
aaa
03/09/16 14:10
davide94
Grazie mille per la risposta e la tua disponibilità !
Ero molto indeciso su questi aspetti del linguaggio.
aaa