El contingut està disponible sota la llicència Creative Commons Attribution Share Alike si no s'indica el contrari.
GETI- ETSEIB- Informàtica- Introducció a les Classes - Curs 21/22 Dani Tost
Introducció a les classes
Bloc 1 de 4
Definicions
Especificació
Informàtica curs 21/22
Prof. D. Tost
El contingut està disponible sota la llicència Creative Commons Attribution Share Alike si no s'indica el contrari.
GETI- ETSEIB- Informàtica- Introducció a les Classes - Curs 21/22 Dani Tost
Classes● Tots els objectes de python (variables, constants,
funcions) estan categoritzats en classes
● Una classe representa l’estructura i funcionalitat comuna a tots els objectes de la classe
● Un objecte d’una classe s’anomena instancia de la classe
Objectes concrets de la classe Cadira: instàncies.
Definició de la classe Cadira: com són, quines característiques i funcions.
El contingut està disponible sota la llicència Creative Commons Attribution Share Alike si no s'indica el contrari.
GETI- ETSEIB- Informàtica- Introducció a les Classes - Curs 21/22 Dani Tost
Classes
● Classes «builtin»: list, tuple, dict, str, set
● De mòduls externs: datetime.date, pandas.Dataframe ...
● Pròpies: Punt2D, Poligon, Personatge, Laberint, ...
l1 i l2 són instàncies de la classe list
Cal saber utilitzar classes i implementar-les.
El contingut està disponible sota la llicència Creative Commons Attribution Share Alike si no s'indica el contrari.
GETI- ETSEIB- Informàtica- Introducció a les Classes - Curs 21/22 Dani Tost
Les funcions type i isinstance
● Per saber quina és la classe a la pertany un objecte utilitzem la funció type
● Per saber si un objecte és d’una classe utilitzem la funció isinstance.
● Això permet per exemple d’executar una instrucció o l’altre segons la classe de l’objecte.
El contingut està disponible sota la llicència Creative Commons Attribution Share Alike si no s'indica el contrari.
GETI- ETSEIB- Informàtica- Introducció a les Classes - Curs 21/22 Dani Tost
Instancies i instanciació Un objecte d’una classe s’anomena «instància». Crear-ne una és «instanciar» l’objecte.La forma estàndard de crear una instància és:
Els paràmetres que cal passar quan es crea una instància estan descrits a l’especificació de la classe. Aprendrem a entendre l’especificació per saber instanciar objectes.
Exemple:>>> a = int() a és una instància de la classe int>>> l = list() l és una instància de la classe list>>> d = date(2020, 9, 28) d és una instància de la classe date
import nom_modulnom_instància = nom_mòdul.nom_classe(paràmetres)
from nom_mòdul import nom_classenom_instància = nom_classe(paràmetres)
O bé
El contingut està disponible sota la llicència Creative Commons Attribution Share Alike si no s'indica el contrari.
GETI- ETSEIB- Informàtica- Introducció a les Classes - Curs 21/22 Dani Tost
Atributs d’instàncies
Per saber quins atributs té una classe, caldrà llegir la seva especificació.
Les instàncies d’una classe tenen definits atributs que representen informació de les instàncies. Els atributs tenen un nom específic propi.
Per consultar un atribut d’una instància:
nom_instància.nom_atribut
Per modificar un atribut d’una instància:
nom_instància.nom_atribut = expressió
Exemple:
>>> d = date(2020, 9, 28) d és una instància de la classe date>>> d.day el valor de l’atribut day de d és 2228
El contingut està disponible sota la llicència Creative Commons Attribution Share Alike si no s'indica el contrari.
GETI- ETSEIB- Informàtica- Introducció a les Classes - Curs 21/22 Dani Tost
Mètodes d’instància
Els mètodes d’instància són funcions definides sobre les instàncies d’una classe. Els mètodes «s’invoquen» a diferència de les funcions que es «criden»:
nom_instància.nom_mètode(paràmetres)
nom_funció(paràmetres)
Crida d’una funció
Invocació d’un mètode
El contingut està disponible sota la llicència Creative Commons Attribution Share Alike si no s'indica el contrari.
GETI- ETSEIB- Informàtica- Introducció a les Classes - Curs 21/22 Dani Tost
Mètodes>>> from datetime import date>>> d = date(2014, 3, 24)>>> d.day23>>> d.month3>>> d.year2014>>> d.weekday()1>>> l = [1, 2, 3]>>> l.sort() >>> sorted(l)
day, month i year són atributs de la instància
weekday() és un mètode de la classe dateS'ha invocat el mètode weekday sobre la instància d
sort és un mètode de les llistes
sorted és una funció que té com a paràmetre una llista
El contingut està disponible sota la llicència Creative Commons Attribution Share Alike si no s'indica el contrari.
GETI- ETSEIB- Informàtica- Introducció a les Classes - Curs 21/22 Dani Tost
Especificació d’una classe
● És el document que descriu les característiques d’una classe. A partir d’aquest document podrem crear i utilitzar instàncies de la classe
● Aquest document proporciona informació sobre:– El nom del mòdul en el que està definida la classe
– El nom de la classe– Com instanciar-la: quins paràmetres cal passar al mètode que crea
la instància
– Quin atributs públics té
– Quins mètodes públics té– Quines funcions i operacions suporta
El contingut està disponible sota la llicència Creative Commons Attribution Share Alike si no s'indica el contrari.
GETI- ETSEIB- Informàtica- Introducció a les Classes - Curs 21/22 Dani Tost
Especificació d’una classe
L’especificació de la classe és documentació i cal entendre-la per saber com crear i utilitzar objectes de la classe.
class nom_mòdul.nom_classe(paràmetres)
Descripció
Atributs:
Llista d’atributs
Mètodes
Llista de mètodes
Operacions i funcions que suporta
Llista d’operacions i mètodes
Paràmetres que caldrà especificar quan es crei una instància de la classe
Alguns paràmetres poden tenir un valor de defecte nom = valor
Mòdul on està implementada la classe
La classe disposa de mètodes que donen suport a aquestes operacions i funcions
El contingut està disponible sota la llicència Creative Commons Attribution Share Alike si no s'indica el contrari.
GETI- ETSEIB- Informàtica- Introducció a les Classes - Curs 21/22 Dani Tost
Especificació d’una classe
● Exemple: veiem l’especificació de la classe Vagó un dels exercicis de l’assignatura i intentem utilitzar-la
La línia class vago.Vago(is, nseu, npeu) indica el nom del mòdul (vago.py), el nom de la classe Vago i els paràmetres que cal passar en crear una instància
El contingut està disponible sota la llicència Creative Commons Attribution Share Alike si no s'indica el contrari.
GETI- ETSEIB- Informàtica- Introducció a les Classes - Curs 21/22 Dani Tost
Especificació d’una classe
● Exemple: veiem l’especificació de la classe Vagó un dels exercicis de l’assignatura i intentem utilitzar-la
Quin és el nom de l’atribut, nseu o nseients? Quina diferència?nseu és el nom del paràmetre formal a partir del qual es calcula el valor inicial de l’atribut nseients. Pot ser qualsevol nom. En canvi el nom de l’atribut és obligatòriament nseients.
El contingut està disponible sota la llicència Creative Commons Attribution Share Alike si no s'indica el contrari.
GETI- ETSEIB- Informàtica- Introducció a les Classes - Curs 21/22 Dani Tost
Especificació d’una classe
● Exemple: veiem l’especificació de la classe Vagó un dels exercicis de l’assignatura i intentem utilitzar-la
Observeu la diferència entre consultar un atribut (v.id) i invocar un mètode (v.capacitat()). Inclús si el mètode no té paràmetres cal posar () després del nom.
El contingut està disponible sota la llicència Creative Commons Attribution Share Alike si no s'indica el contrari.
GETI- ETSEIB- Informàtica- Introducció a les Classes - Curs 21/22 Dani Tost
Especificació d’una classe
● Exemple: veiem l’especificació de la classe Tren en el mateix exercici
Per instanciar un tren només cal passar-li el nom. Es crea un tren buit, sense vagons, amb capacitat 0
El contingut està disponible sota la llicència Creative Commons Attribution Share Alike si no s'indica el contrari.
GETI- ETSEIB- Informàtica- Introducció a les Classes - Curs 21/22 Dani Tost
Especificació d’una classe
● Exemple: veiem l’especificació de la classe Tren en el mateix exercici
El mètode capacitat sobre la classe Tren no és mateix que sobre la classe Vago.
El contingut està disponible sota la llicència Creative Commons Attribution Share Alike si no s'indica el contrari.
GETI- ETSEIB- Informàtica- Introducció a les Classes - Curs 21/22 Dani Tost
Especificació d’una classe
● Exemple: veiem l’especificació de la classe Tren en el mateix exercici
t[0] és el primer vagó del tren, una instància de la classe Vago.
El contingut està disponible sota la llicència Creative Commons Attribution Share Alike si no s'indica el contrari.
GETI- ETSEIB- Informàtica- Introducció a les Classes - Curs 21/22 Dani Tost
Help
● En l’interpret de python feu help(nom classe) per veure’n l’especificació
El contingut està disponible sota la llicència Creative Commons Attribution Share Alike si no s'indica el contrari.
GETI- ETSEIB- Informàtica- Introducció a les Classes - Curs 21/22 Dani Tost
Atributs d’instància● Algunes classes tenen atributs protegits, que no es poden modificar. Per
exemple:
● Totes les instàncies tenen els atributs d’instància definits a l’especificació de la classe (encara que cada instància amb un valor que li és propi). Tanmateix, a una instància se li pot afegir un atribut nou sempre que es desitgi. Les altres instancies no tindran aquest atribut.
El contingut està disponible sota la llicència Creative Commons Attribution Share Alike si no s'indica el contrari.
GETI- ETSEIB- Informàtica- Introducció a les Classes - Curs 21/22 Dani Tost
Atributs públics i privats● Les instàncies poden tenir atributs públics (són els que apareixen a l’especificació) i
també atributs privats que només es poden consultar indirectament a través del mètodes públics i operacions definides sobre la classe.
Per exemple: us heu preguntat on es guardaven els vagons de la clase Tren?No tenim cap atribut de tipus llista o similar que puguem consultar. Per consultar vagons utilitzem la operació t[i] directament i, per afegir-ne, utilitzem el mètode afegir_vago. La classe té un atribut que emmagatzema els vagons, però és privat, no hi podem accedir directament.
El contingut està disponible sota la llicència Creative Commons Attribution Share Alike si no s'indica el contrari.
GETI- ETSEIB- Informàtica- Introducció a les Classes - Curs 21/22 Dani Tost
Atributs de classe● A més dels atributs d’instància, una classe pot tenir atributs de classe. Són
atributs el valor del qual és comú a totes les instàncies.
● Per consultar
i també,
● Per modificar
nom_classe.nom_atribut
nom_instància.nom_atribut
nom_classe.nom_atribut = valor
Alerta que si modifiqueu el valor d’un atribut de classe a través d’una instància, l’atribut passa a ser propi de la instància.
El contingut està disponible sota la llicència Creative Commons Attribution Share Alike si no s'indica el contrari.
GETI- ETSEIB- Informàtica- Introducció a les Classes - Curs 21/22 Dani Tost
Atributs de classe● A més dels atributs d’instància, una classe pot tenir atributs de classe. Són
atributs el valor del qual és comú a totes les instàncies. Sovint s’utilitzen per guardar valors constants de la classe. Per exemple la classe date del mòdul datetime:
El contingut està disponible sota la llicència Creative Commons Attribution Share Alike si no s'indica el contrari.
GETI- ETSEIB- Informàtica- Introducció a les Classes - Curs 21/22 Dani Tost
Atributs de classe● A més dels atributs d’instància, una classe pot tenir atributs de classe. Són
atributs el valor del qual és comú a totes les instàncies. ● Alerta que si modifiqueu el valor d’un atribut de classe a través d’una instància,
l’atribut passa a ser propi de la instància.
Classe ex1.Moble(a, h, col) Atributs de classe prof = 60 la profunditat del moble Atributs d’instància amplada l’amplada del moble (int) alcada l’alçada del moble (int) color el color del moble (str)
Observeu com es consulta l’atribut de classe prof des de la classe i de les instàncies. Quan es modifica m1.prof, en realitat s’està creant un atribut propi de m1.
El contingut està disponible sota la llicència Creative Commons Attribution Share Alike si no s'indica el contrari.
GETI- ETSEIB- Informàtica- Introducció a les Classes - Curs 21/22 Dani Tost
Mètodes de classe
● Les classes també poden tenir mètodes que s’invoquen a nivell de classe. S’utilitzen per exemple, per crear instàncies de formes diferents.
● Per exemple:
El contingut està disponible sota la llicència Creative Commons Attribution Share Alike si no s'indica el contrari.
GETI- ETSEIB- Informàtica- Introducció a les Classes - Curs 21/22 Dani Tost
Operacions● Les classes poden suportar operacions aritmètiques si així ho
consta en l’especificació. Per exemple:
>>> from datetime import datetime>>> d1 = datetime(2017, 2, 20)>>> d2 = datetime(2014, 2, 21) >>> t = d2d1>>> tdatetime.timedelta(1)>>> t.days1
t és una instància a la classe timedelta definida també al mòdul datetime. Analitzeu l’especificació de la classe i veureu que té l’atribut days
La classe datetime suporta l’operador resta
El contingut està disponible sota la llicència Creative Commons Attribution Share Alike si no s'indica el contrari.
GETI- ETSEIB- Informàtica- Introducció a les Classes - Curs 21/22 Dani Tost
Especificació d’una classe
class persona.Persona(nom_persona, naixement)
Classe que representa una persona a partir del nom de la persona (string) i la data de naixement (instància a la classe datetime)
Attributs:
nom: nom de la persona
edat: edat de la persona
>>> import datetime>>> naix = datetime.datetime(1996, 10, 20)
>>> import persona>>> p = persona.Persona('Eric', naix) >>> p.edat21>>> p.nom'Eric'>>> p.naixementTraceback (most recent call last): File "<stdin>", line 1, in <module>AttributeError: 'Persona' object has no attribute 'naixement'>>> p.naixTraceback (most recent call last): File "<stdin>", line 1, in <module>AttributeError: 'Persona' object has no attribute 'naix'
Els atributs s’inicialitzen a partir dels paràmetres. Aquí, en crear la classe Persona es calcula l’atribut edat a partir de la data de naixement però la data en sí no és un atribut.
El contingut està disponible sota la llicència Creative Commons Attribution Share Alike si no s'indica el contrari.
GETI- ETSEIB- Informàtica- Introducció a les Classes - Curs 21/22 Dani Tost
Resum
Instanciació:
import nom_mòdul
nom_instància = nom_mòdul.nom_classe(paràmetres)
O
from nom_mòdul import nom_classe
nom_instància = nom_classe(paràmetres)
Consulta d'un atribut
nom_instància.nom_atribut també, si és de classe, nom_classe.nom_atribut
Assignació d'un valor a un atribut
nom_instància.nom_atribut = valor
(si és de classe nom_classe.nom_atribut = valor)
Invocació d'un mètode
nom_instància.nom_mètode() també, si és de classe, nom_classe.nom_mètode()