6. Programació orientada a objectes
6.1 Definició de classes
6.1.1 Primera Classe
Python, a l'igual que altres llenguatges de programació permet la creació de classes. Podem fer-ho tal i com segueix:
Creació d'una classe Alumne
| Python | |
|---|---|
Ens mostrarà algo com:
Podem ara afegir atributs a la nostre classe:
| Python | |
|---|---|
Ens donarà que les variables ja tenen valor, i llavors ja tenim els valors iniciats i podem fer servir els atributs. El problema és que si ho deixem així tots els objectes tindràn el mateix valor als seus atributs. Podriem deixar-ho així en compte de fer un constructor per defecte, encara que ja vorem que és convenient el crear-lo com segueix:
Creació d'una classe Alumne amb constructor per defecte
Fixar-se que ens trobem:
__init__→ aquest mètode és el que es coneix com a constructor i és el mètode que s'executa quan es crea un objecteself→ és una variable especial que dins d'un objecte fa referència a ell mateix. És molt útil per a distingir quan una variable és la del objecte o altra (del programa principal o paràmetre). Aquestselfés automàtic, i no cal passar-lo com a paràmetre, ja que és el propi objecte. AJavas'anomenathis.
Creació d'una classe Alumne amb constructor amb paràmetres
| Python | |
|---|---|
ens donarà com a eixida:
6.2 Visibilitat dels atributs
En la majoria dels llenguatges de programació, quan definim els atributs, hem d'especificar la modalitat d'accès del mateix. Existeixen 3 modificadors, que són private i public, i desprès un a meitat dels dos que és protected. Dits modificadors indiquen si podem accedir o no als atributs de la classe des de fora d'ella. Repassem-los:
Nota: Des de dins de la classe sempre podem accedir als atributs de la mateixa, siguin publics o privats.
public→ Podem accedir als atributs des de fora de la classeprivate→ No podem accedir als atributs des de fora de la classeprotected→ Són atributs públics, que es convertiran enprivateen les classes hereves d'on s'han definit.
En Python no existeixen aquestes paraules reservades, però fa servir una manera curiosa de determinar-ho, que és la manera en la que posem el nom a les variables. Vejam-ho el següent classe Empleat i fixar-se detingudament en el nom que ens apareix desprès de self:
| Python | |
|---|---|
ens produeix la següent sortida
| Text Only | |
|---|---|
Com podem comprovar:
- Per fer un atribut
publicel farem de manera normal sense fer ninguna cosa especial. El definirem ambself.atribut. Tenim l'exemple amb elself.nom=nom, i posteriorment accedim a ell ambprint("El nom és",emple.nom)sense cap tipus de problema. - Per fer un atribut
protectedel que farem serà definir l'atribut amb un guió baix al principi,self._atribut. Tenim l'exemple ambself._edat=edat. Com que l'accés per a la classeEmpleatés públic podem seguir treballant amb dita variable desde fora de la classe sense que ens done cap error, amb la qual cosaprint("L'edat és",emple._edat)funciona sense cap problema. Les particularitats delprotectedles estudiarem amb l'herència. - Per fer una atribtu
privateel que farem serà definir l'atribut amb dos guions baixos al principi,self.__atribut. Tenim l'exemple ambself.__salari=salari. Com que ara l'accès és privat, llavors des de fora de la classe és com si aquest atribut no existira. Llavors si intentem ferprint("El salari és",emple.__salari)ens bota l'excepcióAttributeErroramb el missatge'Empleat' object has no attribute '__salari'
Getters i Setters
Ni cal dir que la manera més estàndar i còmoda d'accedir als atributs és mitjançant els getters i setters, de manera que farem els atributs privats i els mètodes públics
Exemple complet
6.3 Altres mètodes i sobrecàrrega
Existeixen diversos mètodes interessants que de vegades caldrà escriure. Anem a veure'ls i els provem al nostre empleat:
toString i equals
ense retorna:
6.4 Herència
Per a declarar una clase com a hereva d'altra, haurem de posar el seu nom entre parètesi. Anem a veure-ho amb altre exemple.
Exemple de Herència
Com podem veure:
Comercialhereta d'Empleat- El primer que hem de fer al constructor de Comercial és cridar al constructor de Empleat, i com que no existeix
super()es fa indicant-ho directament. Això ens ve de perles també, ja que Python supporta herència múltiple - Acabem d'assignar els atributs propis (
__comisio) - Si no definim el
__str__, En la crida dins del print com que no l'hem definit, l'herència funciona adequadament, i es crida alstrde Emplet. Cas de definir-lo, mostraria el missatgeJoange te 46 i guanya 1500 euros.