mètodes virtuals? polimorfisme? delegació? herència?

Aquest tros de codi amb Python:

#!/usr/bin/env python
# -*- encoding: utf-8 -*-

class main():
   def laptop(self):
      self.p()

class one(main):
   def p(self):
      print "Lenovo"

class two(main):
   def p(self):
      print "Asus"

# Creem un parell d'instàncies
i_one = one()
i_two = two()

i_one.laptop() # mostra "Lenovo"
i_two.laptop() # mostra "Asus"

El que fa bàsicament és crear 3 classes (dues d’elles –one i two– hereden de la primera –main-) de manera que totes les instàncies que es facin de les classes filles tindran els mètodes de la classe mare (el mètode laptop en aquest cas).

A més cada classe filla defineix una mateixa funció (la funció p).

La gràcia d’aquest disseny és que et permet definir una especialització de comportament de manera que per exemple, si tens una col·lecció d’instàncies de one i two barrejades però vols saber-ne quin portàtil tenen, només cal que executis el mètode laptop a tota la col·lecció que sense cap problema ens dirà per a cada un d’ells quin portàtil té.

El dubte que em queda ara és: quin nom rep aquesta tècnica? Perquè he estat buscant en el llibre de Python que tinc (Learning Python d’O’Reilly) d’on he recordat aquesta possibilitat del Python i no he aconseguit trobar-la ni a l’índex del principi (per temes) ni  el del final (per nom).

Un pensament quant a “mètodes virtuals? polimorfisme? delegació? herència?”

  1. Per definició en Python tots els mètodes són virtuals, que és el que intentes fer en aquest cas. Ara bé, el codi funciona però és conceptualment incorrecte. Si les classes derivades han d’implementar p, has de llençar una excepció de NotImplemented a la clase base (poc pitònic, però efectiu) o bé alguna cosa com hasattr() o dins d’un try / except que segurament és la millor opció.

Deixa un comentari

L'adreça electrònica no es publicarà. Els camps necessaris estan marcats amb *