Classes i objectes en Python
Python permet organitzar els programes a partir d'objectes.
Per a definir els objectes s'utilitzen les «classes» que serien com «plantilles» per a aquests.
Classe: Recull de característiques que són: conjunt d'atributs (de classe, d'instància) i conjunt de mètodes (pot incloure un mètode «constructor»).
Objecte: Instància sobre una classe (objecte creat -materialitzat- a partir d'una classe).
Paraules clau i elements destacables en el món de les classes en Python:
class
(paraula inicial per a la creació d'una classe)__init__
(constructor; hi ha dos caràcters de subratllat a cada costat d'init)self
(designació per al mateix objecte que es crea)Exemple amb explicacions: classe i objectes
# a Python tot són objectes (fins i tot les variables) # classe sense constructor ni atributs ni mètodes class A(): # en la declaració de la classe podem ometre els () pass objecteA = A() print(type(objecteA)) # <class '__main__.A'> # classe amb atributs de classe # als atributs de classe s'hi pot accedir per mitjà de la classe (sense necessitat d'instància d'objecte) class B(): b1 = 10 b2 = 30 objecteB = B() print(objecteB.b1 + objecteB.b2) # 40 # classe amb mètodes (les funcions dins una classe s'anomenen mètodes) class C(): def metodeC(self): # self representa a cada objecte: print("salutacions des de metodeC") objecteC = C() objecteC.metodeC() # classe amb atributs de classe i mètodes class D(): d = "SALUTACIONS DES D'ATRIBUT d" # atributs de classe: compartits per tots els objectes def metodeD(self): print("salutacions des de metodeD i " + self.d) objecteD = D() objecteD.metodeD() # salutacions des de metodeD i SALUTACIONS DES D'ATRIBUT d objecteD.d = "" objecteD.metodeD() # salutacions desde metodeD i # podem establir el valor d'un atribut de classe per a totes les instàncies que s'aniran # creant assignant per mitjà de la classe (com si fos membre abstracte) D.d = "NOU VALOR PER A TOTS ELS NOUS" objecteD2 = D() objecteD3 = D() objecteD4 = D() objecteD2.metodeD() objecteD3.metodeD() objecteD4.metodeD() # als objectes creats prèviament no els afectaria print(objecteD.d, "cometes buides") objecteD.metodeD() # classe amb constructor (a Python només pot haver-hi 1 constructor de classe) # self es obligatori # constructor __init__ s'escriu amb doble guió baix # si l'escrivíssim malament (per exemple un guió simple) no donaria error sinó que seria un mètode vulgar class E(): def __init__(self): print("salutacions des del constructor") objecteE = E() # en instanciar l'objecte s'executa el constructor # classe ambn constructor i atributs d'instància class F(): def __init__(self, f): # atributs d'instància: són especifics de cada objecte # inicialitzem els atributs d'instància amb els paràmetres del constructor self.atributf = f print("salutacions des del constructor i " + f) objecteF = F("salutacions des d'atribut d'instància passat com a paràmetre") # salutacions des del constructor i salutacions des d'atribut d'instància passat com a paràmetre # exemple complet class Cotxe(): # els 'docstring' s'escriuran sota la declaració amb triples cometes """ aquesta classe construeix les característiques d'un cotxe """ n_rodes = 4 # atribut de classe def __init__(self, color): # és habitual usar per a l'atribut el mateix identificador del paràmetre self.color = color # atribut d'instància que pren el valor del paràmetre self.velocitat = 0 # atribut d'instància independent de cap paràmetre # mètode sense cos (sense sentències) def frena(self): pass def accelera(self, acceleracio): """ mètode accelera amb el paràmetre acceleració """ self.velocitat = self.velocitat + acceleracio # acceleració no duu el self al davant # ja que no és un membre de la classe sinó un paràmetre de mètode cotxe1 = Cotxe("gris") print(cotxe1.n_rodes, cotxe1.color, cotxe1.velocitat) # 4 gris 0 cotxe2 = Cotxe("blau") cotxe2.n_rodes = 3 cotxe2.frena() # no executa res cotxe2.accelera(50) cotxe2.accelera(70) print(cotxe2.n_rodes, cotxe2.color, cotxe2.velocitat) # 3 blau 120