# Programación Orientada a Objetos La *programación orientada a objetos* u *object oriented programming* (OOP) es un paradigma de programación que envuelve python de pies a cabeza. A pesar de que python se define como un lenguaje de programación multiparadigma, la programación orientada a objetos es el paradigma principal de éste. A pesar de que varias de las características que tratamos en el apartado anterior se corresponden más con un lenguaje de programación funcional, en python **todo** (o casi todo) es una clase. Python usa una programación orientada a objetos basada en clases[^class], a diferencia de otros lenguajes como JavaScript, donde la orientación a objetos está basada en prototipos[^proto]. No es el objetivo de este documento el de contarte cuales son las diferencias entre ambas, pero es interesante que sepas de su existencia, ya que es una de las pocas diferencias que existen entre estos dos lenguajes de amplio uso en la actualidad. [^class]: [^proto]: ## Programación basada en clases Tras haber hecho una afirmación tan categórica como que en python todo son clases, es nuestra obligación entrar a definir lo que son y qué implica la programación basada en clases. Los objetos, *objects*, son entidades que encapsulan un estado, un comportamiento y una identidad capaz de separarlos de otras entidades. Una clase, *class*, es la definición de estos objetos. Saliendo de la definición filosófica y trayéndola a un nivel de andar por casa, puedes aclararte sabiendo que las clases son la definición enciclopédica de algo, mientras que los objetos son el propio objeto, persona o animal descrito. Llevándolo al ejemplo de un perro, la clase es la definición de qué es un perro y los objetos son los distintos perros que te puedes encontrar en el mundo. La definición de perro indica qué características ha de tener un ente para ser un perro, como ser un animal, concretamente doméstico, qué anatomía debe tener, cómo debe comportarse, etc. Mientras que el propio perro es uno de los casos de esa definición. Cada perro tiene una **identidad propia** y es independiente de los otros, tiene un **comportamiento** concreto (corre, salta, ladra...) y tiene un **estado** (está despierto o dormido, tiene una edad determinada...). La diferencia entre una clase y un objeto tiene lógica si lo piensas desde la perspectiva de que python no tiene ni idea de lo que es un perro y tú tienes que explicárselo. Una vez lo haces, declarando tu clase, puedes crear diferentes perros y ponerlos a jugar. Lo bonito de programar es que tu programa es tu mundo y tú decides lo que es para ti (o para tu programa) un perro.