Diferència entre revisions de la pàgina «POO Classes»
Línia 59: | Línia 59: | ||
== Constructors i destructors == | == Constructors i destructors == | ||
*El '''constructor''' és un mètode que es crida al crear l'objecte. En Python és '''__init__'''. | *El '''constructor''' és un mètode que es crida al crear l'objecte. En Python és '''__init__'''. | ||
− | *El '''destructor''' es crida al destruïr l'objecte. En Python és '''__del__'''. | + | *El '''destructor''' es crida al destruïr l'objecte. En Python és '''__del__''', ja que per destruïr un objecte s'utiltiza la sentència "del". |
Exemple: | Exemple: | ||
<syntaxhighlight lang="Python"> | <syntaxhighlight lang="Python"> | ||
Línia 70: | Línia 70: | ||
Comprovem que realment els mètodes son cridats: | Comprovem que realment els mètodes son cridats: | ||
− | >>> a = A() | + | >>> '''a = A()''' |
construint l'objecte... | construint l'objecte... | ||
− | >>> del a | + | >>> a |
+ | <__main__.A instance at 0xb6ebba2c> | ||
+ | >>> '''del a''' | ||
destruim-lo! | destruim-lo! | ||
+ | >>> a | ||
+ | Traceback (most recent call last): | ||
+ | File "<stdin>", line 1, in <module> | ||
+ | NameError: name 'a' is not defined | ||
+ | |||
+ | Queda't amb què per destruïr un objecte utiltizem '''del'''. | ||
+ | |||
+ | Python (a diferència d'altres llenguates com C++) disposa de '''recol·lecció automàtica de basura'''. Això vol dir que quan un objecte no està referenciat per ningú més el sistema l'esborra de memòria. Resulta molt còmode per evitar "memory leaks", però té un cert impacte en el rendiment, raó pel qual alguns llenguatges no ho implementen. | ||
NOTA PER CLASSES HEREDADES: el constructor de la subclasse sobreescriu el de la superclasse. Per controlar si el cridem es pot fer servir la sentència "super", veure en l'apartat d'herència més avall. | NOTA PER CLASSES HEREDADES: el constructor de la subclasse sobreescriu el de la superclasse. Per controlar si el cridem es pot fer servir la sentència "super", veure en l'apartat d'herència més avall. |
Revisió del 23:09, 3 set 2012
Anem a revisar els aspectes més pràctics dels fonaments de la POO: com crear classes, instanciar objectes i interactuar amb ells.
Per Python disposem del següent link de referència sobre les classes: http://docs.python.org/reference/datamodel.html
Contingut
Classe i instància
- Una classe defineix un tipus de dades, però no la crea.
- Una instància és un objecte real creat a partir del model d'una classe.
- Els atributs (variables internes) els creem inicialitzant-los a un valor dins de la classe.
- Els mètodes (funcions internes) es creen amb def i TOTES tenen com a primer argument self == la instància que el crida.
Creem la classe:
class Pilota():
velocitat = 10
posx = 10
posy = 12
def accelera(self):
self.velocitat = self.velocitat + 5
def posicio(self,x,y):
self.posx = x
self.posy = y
Creem la instància "p" i accedim als atributs:
>>> p = Pilota() >>> p.velocitat 10 >>> p.posy 12
Per executar una funció s'han de posar els parèntesis ():
>>> p.accelera() >>> p.velocitat 15
Quan els mètodes tenen paràmetres cal tenir en compte que el primer sempre serà self. Aquest és necessari per accedir als atributs de la instància que crida l'objecte. Però quan cridem la funció s'ha d'obviar el "self". Per exemple, en el nostre cas tenim posicio(self,x,y) , però per cridar la funció posició ho fem només amb la x i la y:
>>> p.posicio(40,30) >>> p.posx 40 >>> p.posy 30
Introspecció
Podem conèixer els atributs i mètodes d'una classe a través de la sentència dir (ho podem fer sobre una instància o sobre una classe):
>>> dir(Pilota) ['__doc__', '__module__', 'accelera', 'posicio', 'posx', 'posy', 'velocitat']
Si féssim dir(p) (instància) tindria el mateix resultat:
>>> p = Pilota() >>> dir(p) ['__doc__', '__module__', 'accelera', 'posicio', 'posx', 'posy', 'velocitat']
La introspecció és una important característica d'un llenguatge orientat a objecte. No tots els llenguatges en disposen i és molt útil al treballar amb la consola d'instruccions i per depurar (debug).
Constructors i destructors
- El constructor és un mètode que es crida al crear l'objecte. En Python és __init__.
- El destructor es crida al destruïr l'objecte. En Python és __del__, ja que per destruïr un objecte s'utiltiza la sentència "del".
Exemple:
class A():
def __init__(self):
print "construint l'objecte..."
def __del__(self):
print "destruim-lo!"
Comprovem que realment els mètodes son cridats:
>>> a = A() construint l'objecte... >>> a <__main__.A instance at 0xb6ebba2c> >>> del a destruim-lo! >>> a Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'a' is not defined
Queda't amb què per destruïr un objecte utiltizem del.
Python (a diferència d'altres llenguates com C++) disposa de recol·lecció automàtica de basura. Això vol dir que quan un objecte no està referenciat per ningú més el sistema l'esborra de memòria. Resulta molt còmode per evitar "memory leaks", però té un cert impacte en el rendiment, raó pel qual alguns llenguatges no ho implementen.
NOTA PER CLASSES HEREDADES: el constructor de la subclasse sobreescriu el de la superclasse. Per controlar si el cridem es pot fer servir la sentència "super", veure en l'apartat d'herència més avall.
Herència
...
En Python la herència s'introdueix entre parèntesi:
class Pilota():
...
class PilotaDeTennis(Pilota):
color = "verd"
super (constructor del pare)
...cridant al constructor pare... (super) ...
"noves classes" de Python
Llegir: http://docs.python.org/reference/datamodel.html#new-style-and-classic-classes
A partir de la versió 2.1 tots els objectes els heredem de "object". Es solventen alguns problemes antics. Es podria haver posat per defecte, però s'ha mantingut per la compatibilitat amb les aplicacions anteriors.
Ara, per definir un objecte "a la manera nova" (sempre ho farem així en principi):
class Pilota(object):
...
Herència múltiple
...
Sobrecàrrega
...
Operadors
...
Visibilitat
...
Classes i mètodes virtuals
...