Introducción a la programación orientada a objetosa con Python

download Introducción a la programación orientada a objetosa con Python

of 16

Transcript of Introducción a la programación orientada a objetosa con Python

  • 8/6/2019 Introduccin a la programacin orientada a objetosa con Python

    1/16

    Introduccinalaprogramacinorientadaaobjetos

    conPython

  • 8/6/2019 Introduccin a la programacin orientada a objetosa con Python

    2/16

  • 8/6/2019 Introduccin a la programacin orientada a objetosa con Python

    3/16

    Esteartculoesunaintroduccinalaprogramacinorientadaaobjetos(POO,oOOPporsussiglaseningls),

    unodelosparadigmasdeprogramacinestructuradamsimportantehoyenda.

    ElartculousaellenguajePythonparalosdistintosejemplos,yexplicalaimplementacindelaPOOenese

    lenguaje,aunqueabordaconceptosgeneralesquesonfcilmentetrasladablesaotroslenguajes.

    Losfragmentosdecdigosesealanusandounestilodetextodiferente(anchofijo)y,cuandoseutilizael

    intrpretedepython,seprefijacadalneaconlossmbolos>>>.Estaintroduccinpresuponeconocimientos

    bsicosdeprogramacinydellenguajepython.

    Formasdepensar:paradigmasdeprogramacin

    Unodeloselementosbsicosalahoraderealizarunprogramaeslamodelizacindelproblemaquepretende

    resolver.Esprecisolocalizarlasvariablesylosaspectosrelevantes,ascomocomprenderlospasosnecesarios

    paraobtenerelresultadoapartirdelosdatosiniciales,etc.Esdecir,abstraerelproblema,reduciendosus

    detallesdeformaquepodamostrabajarconpocoselementoscadavez.

    Laalgoritmiaplantealaformaptimaderesolverproblemasconcretos,talescomolaordenacindeunalistade

    elementos,labsquedadeunelementoenunconjunto,lamanipulacindeconjuntosdedatos,etc.Sin

    embargo,noproporcionanunmarcogeneral,unenfoque,quenospermitaplantearyformularlassolucionesa

    unproblemadeformacoherente.

    Losparadigmasdeprogramacinllenanesehueco,proporcionandoguastantosobrecmorealizarla

    abstraccindelosdatoscomosobreelcontroldelaejecucin.Esdecir, losparadigmasdeprogramacinson

    herramientasconceptualesparaanalizar,representaryabordarlosproblemas,presentando

    sistematizacionesalternativasocomplementariasparapasardelespaciodelosproblemasaldelas

    implementacionesdeunasolucin.

    Esmuyrecomendableyproductivocomprenderelenfoquededistintosparadigmas,puestoquepresentan

    estrategiasalternativas,incrementandonuestrasherramientasdisponiblesyhacindonoreflexionarsobre

    muchasdelastareasquerealizamosalcrearunprograma.Adems,amenudoocurrequeunosproblemasse

    formulandeformamuyclarasiselosanalizasegnunaperspectivadeterminada,mientrasqueproducenuna

    grancomplejidadvistosdeotramanera.

    Algunosparadigmashabituales

    Algunasdelasformasdepensarlosproblemasquehallegadoasistematizarsecomoparadigmasde

    programacinson:

    Laprogramacinmodular:Losprogramasseformanporpartesseparadasllamadasmdulos.Estosfuncionandeformaindependienteentres,oserelacionanatravsdeinterfacesbiendefinidas.

  • 8/6/2019 Introduccin a la programacin orientada a objetosa con Python

    4/16

    Laprogramacinprocedural:Unprogramasecomponedeprocedimientos(subrutinas,mtodosofunciones)quesonfragmentosdecdigoquepuedenllamarsedesdecualquierpuntodelaejecucin

    deunprograma,includosotrosprocedimientosolmismo.(ej.ALGOL)

    Laprogramacinestructurada:Sepuedeexpresarcualquierprogramautilizandonicamentetresestructurasdecontrol:secuencial,condicionaleiterativa.Losprogramassecomponendepartes

    menoresconunnicopuntodeentrada,ysetratadeaislarlosparaevitarlacomplejidadque

    introducenlosefectoscolaterales.(ej.Pascal,C,Ada)

    Laprogramacinimperativa:Unprogramasepuededefinirentrminosdeestado,ydeinstruccionessecuencialesquemodificandichoestado.(ej.C,BASIC)

    Laprogramacindeclarativa:Esposibleexpresarunprogramaatravsdecondiciones,proposicionesorestricciones,apartirdelosqueseobtienelasolucinmediantereglasinternasdecontrol.(ej.

    PROLOG)

    Laprogramacinfuncional:Sepuedeexpresarunprogramacomounasecuenciadeaplicacindefunciones.Eludeelconceptodeestadodelcmputoynoprecisadelasestructurasdecontroldelaprogramacin

    estructurada.(ej.LISP,Haskell)

    Laprogramacinorientadaaobjetos:Losprogramassedefinenentrminosdeclasesdeobjetosquesecomunicanentresmedianteelenvodemensajes.Esunaevolucindelosparadigmasdela

    programacinprocedural,estructuradaymodular,yseimplementaenlenguajescomoJava,

    Smalltalk,PythonoC++.

    Programacinmultiparadigma

    Losparadigmasdeprogramacinsonidealizaciones,y,comotales,nosiempresepresentandeforma

    totalmentepura,nisiempreresultanincompatiblesentres.Cuandoseentremezclandiversosparadigmasse

    produceloqueseconocecomoprogramacinmultiparadigma.

    Elusodedistintosmodelos,segnseadaptenmejoralasdiversaspartesdeunproblemaoanuestraformade

    pensamiento,resultatambinmsnaturalypermiteexpresardeformamsclarayconcisanuestrasideas.

    Algunoslenguajes,comoHaskelloPrologestndiseadosparaencajarperfectamenteenlavisindeun

    paradigmaparticular,mientrasqueotros,comopython,seadaptanespecialmentebienalaprogramacin

    multiparadigmaydangranlibertadalahoraderesolverunproblema,alnoimponenunmismopatrnpara

    todosloscasos.

    Tiposdedatos

    Unaformadealmacenaryrepresentarunafechaenunprogramapodraserlasiguiente:

    d = 14m = "Noviembre"

  • 8/6/2019 Introduccin a la programacin orientada a objetosa con Python

    5/16

    a = 2006def dime_fecha(dia, mes, anho):

    return "%i de %s de %i del calendario gregoriano" % (dia, mes, anho)print fecha(d, m, a)

    paraobtenerlasiguientesalida:

    "14deNoviembrede2006"

    Enesteejemplo,pararepresentarymanipularloqueconceptualmenteentendemoscomounafecha,seutilizan

    lasvariablesd,myacomoalmacenesdedatos,yunprocedimientoofuncin,denombredime_fecha,para

    realizarlarepresentacindelafechaalmacenada.

    Lasvariablespermitenalmacenartiposdedatosconcretoscomolosenteros(dya)olascadenasdetexto(m),y

    lafuncinrealizasutrabajodevolviendootrotipoconcreto,unacadenadetexto.

    Unodelosproblemasdeesteenfoqueesquenoreflejademasiadobienelconceptofechaqueusamoscomo

    modelomentalalimplementarlocomounconjuntodetresvariablesnorelacionadasentres(d,mya).Esdecir,

    lastresvariablestienenunaunidadconceptualennuestramente,quenosereflejaenlaformadeexpresarel

    problema.Delamismamanera,lafuncindime_fechadesconoceigualmentelarelacinentresusparmetros,

    quepodrasertotalmentearbitraria.

    Estasituacin,quepuedeparecerunacuestindeestilo,implicaunriesgodeproblemasdesincronizacin

    entrevariablesrelacionadas,dispersinendistintaspartesdelcdigodemanipulacionesquesonrelevantesal

    conjunto,prdidadelvalorsemnticodecadavariablequepuededarlugaraerroresaltransformarelcdigo

    Unejemplodedesconexinsemnticaentrelaimplementacinyelconceptoesquedpuedesercualquiervalor

    entero,mientrasqueundatieneunvalorsituadoentre1y31,mesunacadenadetextodentrodeunnmerolimitadodeopciones,oanopuedetomarvaloresnegativos.Porsupuestoqueestosepodrasolucionarcon

    cdigoquehiciesecomprobacionesadicionales,peroenestecasoqueremosresaltarcmounprogramaesun

    modeloaproximadoaunproblemaycmoserapreferiblequelaimplementacinpudieserepresentardeforma

    msajustadaelcomportamientodelmodeloelegido.

    Unaposiblesolucinseradisponerdeuntipodedatosquerepresentedeformamsadecuadaelconceptode

    fechayquenospermitamanipularfechasdelamismamaneraquemanipulamosnmerosenteros,nmeros

    realesocadenasdetexto,independientementedelaimplementacininternaquelossustente.

    Clasesyobjetos

    Alenunciaralgunostiposdeparadigmashemosvistoquelaprogramacinorientadaaobjetosdefinelos

    programasentrminosdeclasesdeobjetosquesecomunicanentresmedianteelenvodemensajes.En

    esteapartadoaclararemosquseentiendeenesecontextoporclasesyobjetos.

    Lasclasessurgendelageneralizacindelostiposdedatosypermitenunarepresentacinmsdirectadelos

    conceptosnecesariosparalamodelizacindeunproblemapermitiendodefinirnuevostiposalusuario.

    Lasclasespermitenagruparenunnuevotipolosdatosylasfuncionalidadesasociadasadichosdatos,

    favoreciendolaseparacinentrelosdetallesdelaimplementacindelaspropiedadesesencialesparasuuso.A

  • 8/6/2019 Introduccin a la programacin orientada a objetosa con Python

    6/16

    estacualidad,denomostrarmsquelainformacinrelevante,ocultandoelestadoylosmtodosinternosdela

    clase,esconocidacomoencapsulacin,yesunprincipioheredadodelaprogramacinmodular.

    Unaspectoimportanteenelusodeclasesesquenosemanipulandirectamente(salvoenloqueseconoce

    comometaprogramacin),sinoquesirvenparaladefinicinnuevostipos.Unaclasedefinepropiedadesy

    comportamientoquesemuestranenlosentesllamadosobjetos(oinstanciasdeunaclase).Laclaseacta

    comomoldedeunconjuntodeobjetos,delosquesedicequepertenecenalaclase.

    Trasladandoestosconceptosalosnmerosenteros(tipo int),sepuededecirquelasvariablesquealmacenan

    nmerosenterossonobjetosoinstanciasdelaclase intoquepertenecenalaclaseint.

    Entrminosmsabstractos,podemospensarenlasclasescomodefinicionesyenlosobjetoscomoexpresiones

    concretasdedichasdefiniciones.

    Fisonomadeunaclase

    Enpython,elesquemaparaladefinicindeunaclaseeselsiguiente:

    class NombreClase:...

    endondeclassesunapalabrareservadaqueindicaladeclaracindeunaclase,NombreClaseunaetiquetaque

    danombrealaclasey,losdospuntos,quesealaneliniciodelbloquedeinstruccionesdelaclase.

    Elcuerpodeinstruccionesdelaclasepuedecontenertantoasignacionesdedatoscomodefinicionesde

    funciones.Estebloquedeinstruccionesseencuentraenelnuevoespaciodenombresconelnombredelaclase,

    quesegenera,asuvez,conlacreacindecadaobjeto.Enamboscasos,enelespaciodenombresdelaclasey

    delobjeto,esposibleaccederaloselementosquelointegranusandoeloperadorpunto,comoenelcasodelos

    espaciosdenombresdeunmdulo(e.j.math.pi,objeto.dato,objeto.funcion()).

    Silaprimerainstruccindelcuerpodelaclaseesunacadenadetexto,staseusacomocadenade

    documentacindelaclase.

    Nuestroejemplopodrareescribirseentrminosdeunaclaseas:

    class Fecha:"Ejemplo de clase para representar fechas"dia = 14

    mes = "Noviembre"anho = 2006def dime_fecha(self):

    return "%i de %s de %i" % (Fecha.dia, Fecha.mes, Fecha.anho)

    mi_fecha = Fecha()

    print mi_fecha.dia, mi_fecha.mes, mi_fecha.anhoprint mi_fecha.dime_fecha()

  • 8/6/2019 Introduccin a la programacin orientada a objetosa con Python

    7/16

  • 8/6/2019 Introduccin a la programacin orientada a objetosa con Python

    8/16

    >>> mi_fecha_2 = Fecha()>>> mi_fecha is mi_fecha_2False>>> print mi_fecha>>> print mi_fecha_2

    Vemosquetantomi_fechacomomi_fecha_2soninstanciasdelaclaseFecha(enelmdulo__main__)ycada

    unatienesupropioespaciodememoriaindependiente.

    >>> print mi_fecha.dime_fecha()14 de Noviembre de 2006>>> print mi_fecha.dia14>>> print mi_fecha_2.dia14>>> Fecha.dia = 16>>> print Fecha.dia16>>> print mi_fecha.dia16>> print mi_fecha_2.dia16

    >>> mi_fecha.dia = 30>>> print Fecha.dia16>>> print mi_fecha.dia30>>> print mi_fecha_2.dia16

    Esteltimoexperimentoobservamoscmo,peseaquemi_fechaymi_fecha_2sondosinstanciasdistintasdela

    claseFecha,ambashacenreferenciaatravsdesuatributodiaalmismovalordelaclaseFecha.dia.Sin

    embargo,cuandoseproduceunaasignacinaeseatributo(aesaetiqueta,enrealidad)enunodelosobjetos

    vemoscmo,apartirdeentonces,eseobjetodisponedeunvalor'individual'asociadoalatributo.

    Esecomportamientorevelalaexistenciadeatributos(oestado)compartidosportodaslasinstanciasdeuna

    claseydeatributos(oestado)ligadosaunainstanciaparticular.Losprimerossesitanenelespaciodenombresdelaclase,yvemoscmosepuedenhacerasignacionesenlasesininteractivaanterior,olecturas,en

    elmtododime_fechadelejemploanterior.Lossegundossesitanenelespaciodenombresdecadaobjeto,y

    ahesdonderesultatilelparmetroself.

    Antesdeproseguir,podemosescudriarqusmbolossonaccesiblesyqucontienenlosespaciosdenombres

    delaclaseFechaydelosobjetosmi_fechaymi_fecha_2.Usamoslafuncindirparaloprimero,yelatributo

    __dict__paralosegundo,yaqueenpythonlosespaciosdenombresseimplementancomodiccionarios:

    >>> dir(Fecha)['__doc__', '__module__', 'anho', 'dia', 'dime_fecha', 'mes']>>> dir(fecha3)

    ['__doc__', '__module__', 'anho', 'dia', 'dime_fecha', 'mes']>>> dir(fecha4)['__doc__', '__module__', 'anho', 'dia', 'dime_fecha', 'mes']

    Enlostrespodemosaccederalosmismossmbolos.Sinembargo...

    >>> Fecha.__dict__{'__module__': '__main__', 'anho': 2006, 'dime_fecha': x00B176F0>, 'dia':14, 'mes': 'Noviembre', '__doc__': 'Ejemplo de clase para representarfechas'}>>> mi_fecha_2.__dict__{}>>> mi_fecha.__dict__

    {'dia': 30}

    Elespaciodenombresdelaclaseeselquealbergalosnombresdelosatributosymtodosindicadosenladeclaracindelaclase,ademsdelosatributosespeciales__doc__,quecontienelacadenadedocumentaciny

  • 8/6/2019 Introduccin a la programacin orientada a objetosa con Python

    9/16

    __module__,quecontieneelnombredelmduloalquepertenecelaclase.Esossmbolossonaccesibles

    tambinparalosobjetospertenecientesalaclase(talcomonosindicabadir()).

    Podemosvertambinqueelespaciodenombresdelobjetomi_fecha_2seencuentravaco,mientrasqueeldel

    objetomi_fechacontieneelatributoda.Estosedebeaqueanteriormenterealizamosunaasignacinal

    atributodiadelobjetomi_fecha(dndoleelvalor30).Elespaciodenombresrecogeesaversinparticulardel

    atributo,quenoapareceenelotroobjeto,puestoqueaccedealatributodeclase.

    Alosatributoscompartidosportodoslosobjetosdeunaclaseselosdenominaatributosdeclase,cuandose

    deseadiferenciarlosdelosatributosquepertenecenacadainstanciaenparticular.

    Accesoindividualizadoaobjetos:self

    Ahoraquehemosvistocmousaratributosdeclaseparacompartirdatosentretodoslosobjetosdeunamisma

    clase,tambinnosinteresaconocercmoutilizaratributoscomunesaunaclaseperoquepuedantomarvalores

    distintosparacadaunodelosobjetos.

    Retomamosahoraelmisteriosoparmetroselfquevimosestabapresentecomoprimerparmetrodetodoslos

    mtodosdeunaclase.Ensumomentoyacomentamosqueselfcontieneunareferenciaalobjetoquerecibela

    seal(elobjetocuyomtodoesllamado),porloquepodemosusaresareferenciaparaaccederalespaciode

    nombresdelobjeto,esdecir,asusatributosindividuales.

    >>> class F:... i = 5... def dime_i(self):

    ... return F.i

    ... def dime_mi_i(self):

    ... return self.i

    ...>>> a = F()>>> a.dime_i()5

    >>> a.dime_mi_i()5>>> a.i = 6>>> a.dime_i()5>>> a.dime_mi_i()

    6>>> a.i

    6

    Enesteejemploelmtododime_iusaelatributodeclaseyretornasuvalor,5,mientrasqueelmtodo

    dime_mi_iusaunareferenciaalobjetoydevuelveelvalor6,elasignadoalatributodelobjetoa.Asaccedemos

    selectivamentealatributodeclaseioalatributodeinstanciai.

    Algoquepuedeaclararalgomslanaturalezadelparmetroself,esrecordarque,cuandohacemosunallamada

    aunmtodoun_metododeunobjetoun_objetopertenecientealaclaseUnaClase,elintrpretetraducela

    expresinun_objeto.un_metodo()comoUnaClase.un_metodo(un_objeto).

    Elusodeselfrespondealaformaparticularenquepythonimplementaelsoportedeobjetos,aunquelenguajes

  • 8/6/2019 Introduccin a la programacin orientada a objetosa con Python

    10/16

    comoJavaoC++utilizanmecanismossimilaresconlapalabrareservadathis.Enpythonselfnoesunapalabra

    reservadaycualquieretiquetausadacomoprimerparmetrovaldraigualmente,aunquesedesaconseja

    totalmenteelusodeotrasetiquetas,portratarsedeunaconvencinmuyarraigadaenellenguajequehaceel

    cdigomslegible,facilitaelresaltadodesintaxis,etc.

    Elmtododeinicializacin__init__

    Hemosvistoyacmodefiniryusaratributosdeclaseydeinstancia.Peroenpythonnoesnecesariala

    declaracindevariables,porloquecualquieratributoalqueserealiceunaasignacinenelcdigoseconvierte

    enunatributodeinstancia:

    >>> a = F()>>> a.i = 6

    >>> a.atr = 3>>> print a.atr

    3>>> a.__dict__{'i': 6, 'atr': 3}

    Unafuncionalidadmuyconvenientequehemosvistoenladeclaracindeatributosdeclaseesladerealizarsu

    inicializacinenelcuerpodelaclase.Parapoderinicializarlosatributosdeunainstanciaexisteunmtodo

    especialquepermiteactuarsobrelainicializacindelobjeto.Dichomtodosedenomina__init__(condos

    guionesbajosalprincipioyalfinal)yadmitecualquiernmerodeparmetros,siendoelprimerolareferenciaal

    objetoqueesincializado(self,porconvencin),quenospermiterealizarlasasignacionesaatributosdela

    instancia.Estemtodoseejecutasiemprequesecreaunnuevoobjetodelaclase,traslaasignacinde

    memoriayconlosatributosdeclaseinicializados,ysecorrespondeparcialmenteconelconceptode

    constructordelaclaseexistenteenotroslenguajes.

    Conlareferenciaquenosproporcionaselfpodemosinicializaratributosdeinstancia,convalores

    predeterminadossilodeseamos,comoencualquierdefinicindefuncin:

    class Clase:def __init__(self, x=2):

    self.x = xself.a = x**2self.b = x**3self.c = 999

    def dime_datos(self):return "Con x=%i obtenemos: a=%i, b=%i, c=%i" % (self.x, self.a,

    self.b, self.c)

    a1 = Clase(2)a1.dime_datos()

    a2 = Clase(3)a2.dime_datos()

    Salida:

    Conx=2obtenemos:a=4,b=8,c=999Conx=3obtenemos:a=9,b=27,c=999

    PropiedadesyAtributos

    Aunqueenlaterminologageneraldelaprogramacinorientadaaobjetosatributoypropiedadsepueden

    utilizarcomosinmimos,enpythonseparticularizaelusodepropiedadesparauntipoespecialdeatributos

  • 8/6/2019 Introduccin a la programacin orientada a objetosa con Python

    11/16

    cuyoaccesoseproduceatravsdellamadasafunciones.

    class ClaseC(object):

    def __init__(self):self.__b = 0

    def __get_b(self):

    return self.__bdef __set_b(self, valor):

    if valor > 10:self.__b = 0

    else:self.__b = valor

    b = property(__get_b, __set_b, 'Propiedad b')

    c1 = ClaseC()print c1.b# b es 0c1.b = 5print c1.b# b es 5c2 = ClaseC()print c2.b

    # b es 0c2.b = 12print c2.b#b es 0

    Enesteejemplosedefinelapropiedadb,cuyocomportamientoes:cuandoserealizaunaasignacin,tomael

    valorentregadosiesmenorque10,o0encasocontrario,yloalmacenaenunatributoprivado__b.Cuandose

    producelalecturadeb,devuelveelvalorguardadoenelatributoprivado.

    EnPython,parapoderusarpropiedadesenunaclaseesnecesariohacerladerivardelaclaseobjectdeahque

    aparezcaalladodelnombredelaclaseClaseC.Enunapartadoposteriorseexplicarenquconsistela

    derivacindeclases.

    Lasignaturadelafuncinproperty,quedefineunapropiedaddelaclaseeslasiguiente:nombre_propiedad=

    property(get_f,set_f,del_f,doc)dondeget_feslafuncinllamadacuandoseproducelalecturadelatributo;

    set_flafuncinllamadacuandoseproduceunaasignacinalatributo;del_flafuncinllamadacuandose

    eliminaelatributo,ydocesunacadenadedocumentacindelapropiedad.

    Laspropiedadesresultanmuytilespararealizarlavalidacindelosvaloresasignados,latransformacino

    clculodevaloresdevueltosy,adems,dotandegranflexibilidadalahoradeescribirelcdigo,puestoquees

    posibleempezarusandoatributosyluegosustituirloporunapropiedadquerealicefuncionesadicionales,a

    medidaqueelcdigolorequieraysimplementecambiandoelcdigodelaclase,sinafectaralcdigoclientede

    laclase.

    Herenciayderivacindeclases

    Vemosqueelusodeclaseshacemsadecuadalarepresentacindeconceptosennuestrosprogramas.

    Adems,esposiblegenerarunaclasenuevaapartirdeotra,delaquerecibesucomportamientoyestado

    (mtodosyatributos),adaptndolosoamplindolossegnseanecesario.

  • 8/6/2019 Introduccin a la programacin orientada a objetosa con Python

    12/16

    Deunaclasequerepresentaseelconceptodevehculopodramosderivarotraspararepresentarautomviles,

    bicicletas,barcosoaviones,dondecadaunodeellosmantieneatributosymtodoscomunes(peso,color,

    velocidadmxima,nmerodepasajeros),mientrasqueotrossonexclusivos(nmeroderuedas,nmerode

    hlices,nmerodereactores,altitudmximadevuelo...).

    Entrminosmatemticospodemosexpresarlodiciendoqueesposibleestablecerrelacionesdepertenencia

    entreclases.SitenemosunaclaseAydeelladerivamosunaclaseB,podemosdecirque"BesunaA",oque"Bes

    unaespecializacindeA".

    EnlaterminologadelaPOOsediceque"BheredadeA","BesunaclasederivadadeA","AeslaclasebasedeB",

    "AessuperclasedeB"o"AesclasemadredeB".

    Estofacilitalareutilizacindelcdigo,puestoquesepuedenimplementarloscomportamientosydatosbsicos

    enunaclasebaseyespecializarlosenlasclasesderivadas.

    Enunprogramahipotticoquetrabajaseconformasgeomtricas,podramostenerunaclasebaseFormay

    clasesderivadasdeellacomoTriangulo,Cuadrado,Circulo...Enlaclasebasepodramosdefinirunmtododibuja

    querepresentalafiguraenpantalla,yunmtodoareayotropermetroquecalculanelreayelpermetro,

    respectivamente.

    Enellenguajepython,paraexpresarqueunaclasederiva,desciendeoesherederadeotrauotrasclasesse

    aadetraselnombre,enladeclaracindelaclase,unatuplaconlosnombresdelasclasesbase.

    ElsiguienteejemplocreaunaClaseAydeelladerivaunaClaseBqueinicializaunatributoadicional,cambiael

    comportamientodeunmtodoyheredalosatributosdelaclasemadre:

    class ClaseA:

    def __init__(self, x):self.a = xself.b = 2 * x

    def muestra(self):print "a=%i, b=%i" % (self.a, self.b)

    class ClaseB(ClaseA):def __init__(self, x, y):

    ClaseA.__init__(self, x)

    self.c = 3 * (x + y) + self.bdef muestra(self):

    print "a=%i, b=%i, c=%i" % (self.a, self.b, self.c)

    print "Objeto A"a = ClaseA(2)print a.__dict__a.muestra()

    print "ObjetoB"

    b = ClaseB(2, 3)print b.__dict__b.muestra()

  • 8/6/2019 Introduccin a la programacin orientada a objetosa con Python

    13/16

    Salida:

    ObjetoA

    {'a':2,'b':4}

    a=2,b=4

    ObjetoB

    {'a':2,'c':19,'b':4}

    a=2,b=4,c=19

    LaclaseClaseAmuestrafuncionalidadesqueyahemosidoviendoenestaintroduccin(atributosdeinstanciaa

    yb,mtodomuestra).LaclaseClaseBsedeclaracomodescendientedelaClaseA,porloqueheredasus

    mtodosyatributosymodificaalgoelcomportamientodelaclasemadre.Porunaparte,ensumtodode

    inicializacinllamaalmtododelaclasemadreconlosparmetrosdeseados,y,posteriomente,aadeun

    nuevoatributodeinstanciaquenoexisteenlaclasemadre.Porotrolado,redefineunmtodoexistenteen

    ClaseA,cambiandolaimplementacin.

    Estaltimatcnica,enlaqueunmismonombreseasociaacomportamientosdistintosseconocecomo

    polimorfismo,ysehabladequeelmtodosehasobrecargado,esdecir,seleasignandistintossignificadosen

    funcindesucontexto.Elpolimorfismotambinaludealaposibilidaddeutilizar,enuncontextoenelquese

    esperaunaclasedada,cualquierclasederivada.

    Laclaseobject

    Desdelaversin2.2depython,sehaestablecidounaclasebasellamadaobjectdelaqueseaconsejaderivar

    todaslasclases.Estopermiteaprovecharunaseriedecaractersticassloexistentesenlas"nuevasclases"

    (comoladefinicindepropiedades),quesedescribenenladocumentacindepython.

    Enelejemplosobreelusodepropiedadesseintrodujolaherenciasinexplicarla,derivandolaclasedeobject.

    Ahoradeberaestarmsclaralarazn.

    Jerarquasdeclases

    Laherenciapermiteestablecerrelacionesentreclases,y,estasrelacionesdepertenenciapuedenseravarios

    niveles,yramificarseenloquesedenominanjerarquasdeclases.

    Unejemplodeclsicoparavisualizarlasjerarquasdeclaseseselquepodraservirparamodelizarelconjuntode

    empleadosdeunaempresa.EnellaapareceunaclasebaseEmpleado,quedisponedelosatributosnombrey

    departamento;deelladesciendenlassubclasesGestor(atributoadicionalinformes)yTrabajador(atributo

    adicionalproyectos),ydeestaltimaderivanlasclasesComercial(atributoadicionalparticipacin)eIngeniero

    (atributooriginalarea).

    Grficamentepodrarepresentarsedelasiguientemanera:

  • 8/6/2019 Introduccin a la programacin orientada a objetosa con Python

    14/16

    Eneldiagramasepuedeverennegritalosatributosqueimplementacadaclase,yengrislosqueheredade

    clasesmadre.Elcdigo(bsicodeinicializacin)delasclasespodraserelsiguiente:

    class Empleado:def __init__(self, nombre, departamento="general"):

    self.nombre = nombreself.departamento = departamento

    class Gestor(Empleado):def __init__(self, nombre):

    Empleado.__init__(self, nombre)

    self.informes = []

    class Trabajador(Empleado):def __init__(self, nombre):

    Empleado.__init__(self, nombre)self.proyectos = []

    class Comercial(Trabajador):def __init__(self, nombre, participacion=0.1):

    Trabajador.__init__(self, nombre)

    self.departamento = "ventas"self.participacion = participacion

    class Ingeniero(Trabajador):def __init__(self, nombre, area="mecnica"):

    Trabajador.__init__(self, nombre)

    self.departamento = "ingeniera"self.area = area

    Naturalmente,cadaunadelasclasestendrasuspropiosmtodosquedefinirancomportamientospropiosde

    cadaclaseosubclase,quenosehandetalladoenelejemplo.

    Unaalternativaalaherenciaeslacomposicin,enelqueunaclasesecomponedeotrasclasesinternas,yque

    puedeserunamejoralternativaenmuchoscasos.

    Encapsulacinygradosdeprivacidad

    UnodelosprincipiosqueguanlaPOO,heredadosdelaprogramacinmodular,eseldeencapsulacin.Hemos

  • 8/6/2019 Introduccin a la programacin orientada a objetosa con Python

    15/16

    vistocmosepuedeagruparcomportamientoydatosgraciasalusodeobjetos,perohastaelmomento,tanto

    losatributoscomolosmtodosquesedefinenenlasclasescorrespondientesseconviertenenmtodosy

    atributosvisiblesparalosusuariosdelaclase(laAPIdelaclase).

    Sedicequeunmtodooatributoespblicosiesaccesibledesdeelexteriordelaclase,mientrasquese

    denominaprivadoencasocontrario.

    Esdeseablepodersealarqumtodosyatributosnodebenutilizarsefueradelaclaseparaevitarexponer

    excesivamentelosdetallesdelaimplementacindeunaclaseounobjeto.

    Pythonutilizaparaelloconvencionesalahoradenombrarmtodosyatributos,deformaquesesealesu

    carcterprivado,parasuexclusindelespaciodenombres,oparaindicarunafuncinespecial,normalmente

    asociadaafuncionalidadesestndardellenguaje.

    _nombre

    Losnombresquecomienzanconunnicoguinbajoindicandeformadbilunusointerno.Adems,estos

    nombresnoseincorporanenelespaciodenombresdeunmduloalimportarlocon"from...import*".

    __nombre

    Losnombresqueempiezanpordosguionesbajosindicansuusoprivadoenlaclase.

    Porejemplo,enladefinicindeclasesiguiente:

    class ClaseA:def __init__(self, a)

    self.__a = aself.x = self.__a**2 + 2

    self.y = self.__a**3 + 3

    elatributo__aesdeusointernodelaclaseynoseexportadirectamente.Acontinuacinpodemosvercmo

    tratalosatributos'privados'python:

    >>> a = ClaseA(2)>>> dir(a)

    ['_ClaseA__a', '__doc__', '__init__', '__module__', 'x', 'y']>>> a.__dict__{'x':6, 'y':11, '_ClaseA__a':2}

    Todavaesposibleaccedera__a,peroelnombreestransformadoa'_ClaseA__a',quelosealacomoun

    atributodeusoprivado.

    __nombre__

    Losnombresqueempiezanyacabancondosguionesbajosindicanatributos"mgicos",deusoespecialyque

    residenenespaciosdenombresquepuedemanipularelusuario.Solamentedebenusarseenlamaneraquese

    describeenladocumentacindepythonydebeevitarselacreacindenuevosatributosdeestetipo.

  • 8/6/2019 Introduccin a la programacin orientada a objetosa con Python

    16/16

    Algunosejemplosdenombres"singulares"deestetiposon:__init__,mtododeinicializacinde

    objetos__del__,mtododedestruccindeobjetos__doc__,cadenadedocumentacindemdulos,

    clases...__class__,nombredelaclase__str__,mtodoquedevuelveunadescripcindelaclasecomocadena

    detexto__repr__,mtodoquedevuelveunarepresentacindelaclasecomocadenadetexto__module__,

    mduloalquepertenecelaclaseSepuedeconsultarlalistadeatributosdeestetipoysudescripcindetallada

    enladocumentacindepython.

    Resmenfinal

    Laprogramacinorientadaaobjetosenuncialaposibilidaddeescribirunprogramacomounconjuntodeclases

    deobjetoscapacesdealmacenarsuestado,yqueinteractanentresatravsdelenvodemensajes.

    Lastcnicasmsimportantesutilizadasenlaprogramacinorientadaaobjetosson:

    Abstraccin:Losobjetospuedenrealizartareas,interactuarconotrosobjetos,omodificareinformarsobresuestadosinnecesidaddecomunicarcmoserealizandichasacciones.

    Encapsulacin(uocultacindelainformacin):losobjetosimpidenlamodificacindesuestadointernoolallamadaamtodosinternosporpartedeotrosobjetos,ysolamenteserelacionanatravsdeuna

    interfazclaraquedefinecmoserelacionanconotrosobjetos.

    Polimorfismo:comportamientosdistintospuedenestarasociadosalmismonombre Herencia:losobjetosserelacionanconotrosestableciendojerarquas,yesposiblequeunosobjetoshereden

    laspropiedadesymtodosdeotrosobjetos,extendiendosucomportamientoy/oespecializndolo.

    Losobjetosseagrupanasenclasesqueformanjerarquas.

    Lasclasesdefinenelcomportamientoyestadodisponiblequeseconcretaenlosobjetos.

    Losobjetossecaracterizanpor:

    Teneridentidad.Sediferencianentres. Definirsucomportamientoatravsdemtodos. Definiroreflejarsuestadoatravsdepropiedadesyatributos.