{"id":42596,"date":"2021-07-21T11:27:17","date_gmt":"2021-07-21T09:27:17","guid":{"rendered":"https:\/\/kinsta.com\/?p=97958"},"modified":"2025-02-11T09:59:56","modified_gmt":"2025-02-11T08:59:56","slug":"programacion-orientada-objetos-python","status":"publish","type":"post","link":"https:\/\/kinsta.com\/es\/blog\/programacion-orientada-objetos-python\/","title":{"rendered":"Gu\u00eda para Principiantes de la Programaci\u00f3n Orientada a Objetos (POO) en Python"},"content":{"rendered":"<p>La programaci\u00f3n es un arte. Y al igual que en el arte, la selecci\u00f3n de los pinceles y pinturas adecuados es esencial para producir las mejores obras. La programaci\u00f3n orientada a objetos (POO &#8211; Object-Oriented Programming) en Python es una de esas habilidades.<\/p>\n<p>La elecci\u00f3n <a href=\"https:\/\/kinsta.com\/es\/blog\/mejor-lenguaje-de-programacion-para-aprender\/\">del lenguaje de programaci\u00f3n adecuado<\/a> es una parte crucial de cualquier proyecto, y puede conducir a un desarrollo fluido y agradable o a una completa pesadilla. Por lo tanto, lo mejor es que utilices el lenguaje que mejor se adapte a tu caso de uso.<\/p>\n<p>Esa es la principal raz\u00f3n para aprender programaci\u00f3n orientada a objetos en Python, que adem\u00e1s es uno de los lenguajes de programaci\u00f3n m\u00e1s populares.<\/p>\n<p>\u00a1Vamos a aprender!<\/p>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc>\n<h2>Un ejemplo de programa en Python<\/h2>\n<p>Antes de entrar en materia, vamos a plantear una pregunta: \u00bfhas escrito alguna vez un programa en Python como el siguiente?<\/p>\n<pre><code class=\"language-python\">secret_number = 20\n \nwhile True:\n   number = input('Guess the number: ')\n \n   try:\n       number = int(number)\n   except:\n       print('Sorry that is not a number')\n       continue\n \n   if number != secret_number:\n       if number &gt; secret_number:\n           print(number, 'is greater than the secret number')\n \n       elif number &lt; secret_number:\n           print(number, 'is less than the secret number')\n   else:\n       print('You guessed the number:', secret_number)\n       break\n<\/code><\/pre>\n<p>Este c\u00f3digo es un simple adivinador de n\u00fameros. Intenta copiarlo en un archivo Python y ejecutarlo en tu sistema. Cumple perfectamente su prop\u00f3sito.<\/p>\n<p>Pero aqu\u00ed surge un gran problema: \u00bfy si te pedimos que implementes una <a href=\"https:\/\/kinsta.com\/es\/changelog\/\">nueva funci\u00f3n<\/a>? Podr\u00eda ser algo sencillo, por ejemplo:<\/p>\n<p>\u00abSi la entrada es un m\u00faltiplo del n\u00famero secreto, da una pista al usuario\u00bb.<\/p>\n<p>El programa se volver\u00eda r\u00e1pidamente complejo y pesado al aumentar el n\u00famero de funciones y, por tanto, el n\u00famero total de condicionales anidados.<\/p>\n<p>Ese es precisamente el problema que intenta resolver la programaci\u00f3n orientada a objetos.<\/p>\n\n<h2>Requisitos para aprender Python OOP<\/h2>\n<p>Antes de adentrarte en la programaci\u00f3n orientada a objetos, te recomendamos encarecidamente que tengas unos conocimientos b\u00e1sicos de Python.<\/p>\n<p>Clasificar los temas considerados \u00abb\u00e1sicos\u00bb puede ser dif\u00edcil. Por ello, hemos dise\u00f1ado una <a href=\"https:\/\/kinsta.com\/es\/hojas-de-trucos\/\">hoja de trucos<\/a> con los principales conceptos necesarios para aprender programaci\u00f3n orientada a objetos en Python.<\/p>\n<ul>\n<li><strong>Variable: <\/strong>Nombre simb\u00f3lico que apunta a un objeto espec\u00edfico (veremos qu\u00e9 significan <strong>los objetos <\/strong>a lo largo del art\u00edculo).<\/li>\n<\/ul>\n<ul>\n<li><strong>Operadores aritm\u00e9ticos: <\/strong>Suma (+), resta (-), multiplicaci\u00f3n (*), divisi\u00f3n (\/), divisi\u00f3n entera (\/\/), m\u00f3dulo (%).<\/li>\n<\/ul>\n<ul>\n<li><strong>Tipos de datos incorporados: <\/strong>Num\u00e9ricos (enteros, flotantes, complejos), Secuencias (cadenas, listas, tuplas), Booleanos (Verdadero, Falso), Diccionarios y Conjuntos.<\/li>\n<\/ul>\n<ul>\n<li><strong>Expresiones booleanas: <\/strong>Expresiones en las que el resultado es <strong>True <\/strong>o <strong>False.<\/strong><\/li>\n<\/ul>\n<ul>\n<li><strong>Condicional: <\/strong>Eval\u00faa una expresi\u00f3n booleana y realiza alg\u00fan proceso dependiendo del resultado. Se maneja mediante sentencias <strong>if\/else<\/strong>.<\/li>\n<\/ul>\n<ul>\n<li><strong>Bucle: <\/strong>Ejecuci\u00f3n repetida de bloques de c\u00f3digo. Pueden ser bucles <strong>for <\/strong>o <strong>while<\/strong>.<\/li>\n<\/ul>\n<ul>\n<li><strong>Funciones: <\/strong>Bloque de c\u00f3digo organizado y reutilizable. Se crean con la palabra clave <strong>def<\/strong>.<\/li>\n<\/ul>\n<ul>\n<li><strong>Argumentos: <\/strong>Objetos que se pasan a una funci\u00f3n. Por ejemplo: <code>sum([1, 2, 4])<\/code><\/li>\n<\/ul>\n<ul>\n<li><strong>Ejecuta un script de Python<\/strong>: Abre un terminal o <a href=\"https:\/\/kinsta.com\/es\/blog\/comandos-de-ssh\/\">l\u00ednea de comandos<\/a> y escribe \u00abpython &lt;nombre del archivo&gt;\u00bb.<\/li>\n<\/ul>\n<ul>\n<li><strong>Abre un shell de Python<\/strong>: Abre un terminal y escribe <code>python<\/code> o <code>python3<\/code> dependiendo de tu sistema.<\/li>\n<\/ul>\n<p>Ahora que tienes estos conceptos muy claros, puedes avanzar en la comprensi\u00f3n de la programaci\u00f3n orientada a objetos.<\/p>\n<h2>\u00bfQu\u00e9 es la programaci\u00f3n orientada a objetos en Python?<\/h2>\n<p>La programaci\u00f3n orientada a objetos (POO) es un paradigma de programaci\u00f3n en el que podemos pensar en problemas complejos como objetos.<\/p>\n<p>Un paradigma es una teor\u00eda que proporciona la base para resolver problemas.<\/p>\n<p>As\u00ed que cuando hablamos de POO, nos referimos a un conjunto de conceptos y patrones que utilizamos para resolver problemas con objetos.<\/p>\n<p>Un objeto en Python es una colecci\u00f3n \u00fanica de datos (atributos) y comportamiento (m\u00e9todos). Puedes pensar en los objetos como cosas reales que te rodean. Por ejemplo, considera las calculadoras:<\/p>\n<figure id=\"attachment_97985\" aria-describedby=\"caption-attachment-97985\" style=\"width: 1024px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/06\/Kinsta-Objects-around-you.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-97985 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/06\/Kinsta-Objects-around-you.png\" alt=\"Una calculadora puede ser un objeto.\" width=\"1024\" height=\"512\"><\/a><figcaption id=\"caption-attachment-97985\" class=\"wp-caption-text\">Una calculadora puede ser un objeto.<\/figcaption><\/figure>\n<p>Como puedes observar, los datos (atributos) son siempre sustantivos, mientras que los comportamientos (m\u00e9todo) son siempre verbos.<\/p>\n<p>Esta compartimentaci\u00f3n es el concepto central de la programaci\u00f3n orientada a objetos. Se construyen objetos que almacenan datos y contienen tipos espec\u00edficos de funcionalidad.<\/p>\n<h2>\u00bfPor qu\u00e9 utilizamos la programaci\u00f3n orientada a objetos en Python?<\/h2>\n<p>La POO permite crear software seguro y fiable. Muchos <a href=\"https:\/\/kinsta.com\/es\/blog\/php-vs-python\/#library-support\">marcos y bibliotecas de Python<\/a> utilizan este paradigma para construir su c\u00f3digo base. Algunos ejemplos son Django, Kivy, pandas, NumPy y TensorFlow.<\/p>\n<p>Veamos las principales ventajas de usar OOP en Python.<\/p>\n<h3>Ventajas de la POO de Python<\/h3>\n<p>Las siguientes razones te har\u00e1n optar por utilizar la programaci\u00f3n orientada a objetos en Python.<\/p>\n<h4>Todos los lenguajes de programaci\u00f3n modernos utilizan la POO<\/h4>\n<p>Este paradigma es independiente del lenguaje. Si aprendes POO en Python, podr\u00e1s utilizarlo en lo siguiente:<\/p>\n<ul>\n<li>Java<\/li>\n<li>PHP (aseg\u00farate de leer la <a href=\"https:\/\/kinsta.com\/es\/blog\/php-vs-python\/\">comparaci\u00f3n entre PHP y Python<\/a>)<\/li>\n<li>Ruby<\/li>\n<li><a href=\"https:\/\/kinsta.com\/es\/blog\/bibliotecas-javascript\/\">Javascript<\/a><\/li>\n<li>C#<\/li>\n<li>Kotlin<\/li>\n<\/ul>\n<p>Todos estos lenguajes est\u00e1n orientados a objetos de forma nativa o incluyen opciones para la funcionalidad orientada a objetos. Si quieres aprender cualquiera de ellos despu\u00e9s de Python, ser\u00e1 m\u00e1s f\u00e1cil: encontrar\u00e1s muchas similitudes entre los lenguajes que trabajan con objetos.<\/p>\n<h4>La POO te permite codificar m\u00e1s r\u00e1pido<\/h4>\n<p>Codificar m\u00e1s r\u00e1pido no significa escribir menos l\u00edneas de c\u00f3digo. Significa que puedes implementar m\u00e1s funciones en menos tiempo sin comprometer la estabilidad de un proyecto.<\/p>\n<p>La programaci\u00f3n orientada a objetos te permite reutilizar el c\u00f3digo mediante la implementaci\u00f3n de la <a href=\"#1-abstraction\">abstracci\u00f3n<\/a>. Este principio hace que tu c\u00f3digo sea m\u00e1s conciso y legible.<\/p>\n<p>Como ya sabr\u00e1s, los <a href=\"https:\/\/kinsta.com\/es\/blog\/contratar-desarrollador-de-wordpress\/\">programadores<\/a> pasan mucho m\u00e1s tiempo leyendo c\u00f3digo que escribi\u00e9ndolo. Es la raz\u00f3n por la que la legibilidad es siempre m\u00e1s importante que sacar caracter\u00edsticas lo m\u00e1s r\u00e1pido posible.<\/p>\n<figure id=\"attachment_97986\" aria-describedby=\"caption-attachment-97986\" style=\"width: 1024px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/06\/Kinsta-Not-legible-code.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-97986 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/06\/Kinsta-Not-legible-code.png\" alt=\"La productividad disminuye con un c\u00f3digo no legible\" width=\"1024\" height=\"512\"><\/a><figcaption id=\"caption-attachment-97986\" class=\"wp-caption-text\">La productividad disminuye con un c\u00f3digo no legible<\/figcaption><\/figure>\n<p>M\u00e1s adelante ver\u00e1s m\u00e1s sobre el principio de abstracci\u00f3n.<\/p>\n<h4>La OOP te ayuda a evitar el c\u00f3digo espagueti<\/h4>\n<p>\u00bfRecuerdas el programa de adivinaci\u00f3n de n\u00fameros del principio de este art\u00edculo?<\/p>\n<p>Si sigues a\u00f1adiendo funciones, tendr\u00e1s muchas sentencias <strong>if <\/strong>anidadas en el futuro. Esta mara\u00f1a de interminables l\u00edneas de c\u00f3digo se llama c\u00f3digo espagueti, y deber\u00edas evitarla en la medida de lo posible.<\/p>\n<p>La programaci\u00f3n orientada a objetos nos da la posibilidad de <a href=\"https:\/\/kinsta.com\/es\/blog\/activar-compresion-gzip\/\">comprimir<\/a> toda la l\u00f3gica en objetos, evitando as\u00ed largos trozos de <strong>if&#8217;s <\/strong>anidados.<\/p>\n<h4>La POO mejora el an\u00e1lisis de cualquier situaci\u00f3n<\/h4>\n<p>Una vez que tengas algo de experiencia con la POO, podr\u00e1s pensar en los problemas como objetos peque\u00f1os y espec\u00edficos.<\/p>\n<p>Esta comprensi\u00f3n conduce a una r\u00e1pida puesta en marcha del proyecto.<\/p>\n<h3>Programaci\u00f3n estructurada frente a la programaci\u00f3n orientada a objetos<\/h3>\n<p>La programaci\u00f3n estructurada es el paradigma m\u00e1s utilizado por los principiantes porque es la forma m\u00e1s sencilla de construir un peque\u00f1o programa.<\/p>\n<p>Se trata de ejecutar un programa Python de forma secuencial. Eso significa que le das al ordenador una lista de tareas y luego las ejecutas de arriba a abajo.<\/p>\n<p>Veamos un ejemplo de programaci\u00f3n estructurada con un programa de cafeter\u00eda.<\/p>\n<pre><code class=\"language-python\">small = 2\nregular = 5\nbig = 6\n \nuser_budget = input('What is your budget? ')\n \ntry:\n   user_budget = int(user_budget)\nexcept:\n   print('Please enter a number')\n   exit()\n \nif user_budget &gt; 0:\n   if user_budget &gt;= big:\n       print('You can afford the big coffee')\n       if user_budget == big:\n           print('It\\'s complete')\n       else:\n           print('Your change is', user_budget - big)\n   elif user_budget == regular:\n       print('You can afford the regular coffee')\n       print('It\\'s complete')\n   elif user_budget &gt;= small:\n       print('You can buy the small coffee')\n       if user_budget == small:\n           print('It\\'s complete')\n       else:\n           print('Your change is', user_budget - small)\n<\/code><\/pre>\n<p>El c\u00f3digo anterior act\u00faa como un vendedor de cafeter\u00eda. Te pedir\u00e1 un presupuesto y luego te \u00abvender\u00e1\u00bb el mejor caf\u00e9 que seas capaz de comprar.<\/p>\n<p>Intenta ejecutarlo en la <a href=\"https:\/\/kinsta.com\/es\/blog\/wp-cli\/\">terminal<\/a>. Se ejecutar\u00e1 paso a paso, dependiendo de tu entrada.<\/p>\n<p>Este c\u00f3digo funciona perfectamente, pero tenemos tres problemas:<\/p>\n<ol>\n<li>Tiene mucha l\u00f3gica repetida.<\/li>\n<li>Utiliza muchos condicionales <strong>if <\/strong>anidados.<\/li>\n<li>Ser\u00e1 dif\u00edcil de leer y modificar.<\/li>\n<\/ol>\n<p>La POO se invent\u00f3 como soluci\u00f3n a todos estos problemas.<\/p>\n<p>Veamos el programa anterior implementado con POO. No te preocupes si a\u00fan no lo entiendes. Es solo para comparar la programaci\u00f3n estructurada y la programaci\u00f3n orientada a objetos.<\/p>\n<pre><code class=\"language-python\">class Coffee:\n        # Constructor\n        def __init__(self, name, price):\n                self.name = name\n                self.price = float(price)\n        def check_budget(self, budget):\n                # Check if the budget is valid\n                if not isinstance(budget, (int, float)):\n                        print('Enter float or int')\n                        exit()\n                if budget &lt; 0: \n                    print('Sorry you don\\'t have money') \n                    exit() \n        def get_change(self, budget):\n                return budget - self.price\n        \n        def sell(self, budget):\n                self.check_budget(budget)\n                if budget &gt;= self.price:\n                        print(f'You can buy the {self.name} coffee')\n                        if budget == self.price:\n                                print('It\\'s complete')\n                        else:\n                                print(f'Here is your change {self.get_change(budget)}$')\n\n                        exit('Thanks for your transaction')\n<\/code><\/pre>\n<p><strong>Nota: <\/strong>Todos los conceptos siguientes se explicar\u00e1n con mayor profundidad a lo largo del art\u00edculo.<\/p>\n<p>El c\u00f3digo anterior representa una <strong>clase <\/strong>llamada \u00abCoffee\u00bb. Tiene dos atributos &#8211; \u00abName\u00bb y \u00abPrice\u00bb &#8211; y ambos se utilizan en los m\u00e9todos. El m\u00e9todo principal es \u00abSell\u00bb, que procesa toda la l\u00f3gica necesaria para completar el proceso de venta.<\/p>\n<p>Si intentas ejecutar esa clase, no obtendr\u00e1s ninguna salida. Ocurre principalmente porque solo estamos declarando la \u00abplantilla\u00bb para los caf\u00e9s, no los caf\u00e9s en s\u00ed.<\/p>\n<p>Implementemos esa clase con el siguiente c\u00f3digo:<\/p>\n<pre><code class=\"language-python\">small = Coffee('Small', 2)\nregular = Coffee('Regular', 5)\nbig = Coffee('Big', 6)\n \ntry:\n   user_budget = float(input('What is your budget? '))\nexcept ValueError:\n   exit('Please enter a number')\n  \nfor coffee in [big, regular, small]:\n   coffee.sell(user_budget)\n<\/code><\/pre>\n<p>Aqu\u00ed estamos haciendo <strong>instancias, <\/strong>u objetos de caf\u00e9, de la clase \u00abCoffee\u00bb, y luego llamando al m\u00e9todo \u00absell\u00bb de cada caf\u00e9 hasta que el usuario pueda pagar cualquier opci\u00f3n.<\/p>\n<p>Obtendremos el mismo resultado con ambos enfoques, pero podemos ampliar la funcionalidad del programa mucho mejor con la POO.<\/p>\n<p>A continuaci\u00f3n se muestra una tabla comparativa entre la programaci\u00f3n orientada a objetos y la programaci\u00f3n estructurada:<\/p>\n<table>\n<tbody>\n<tr>\n<td><strong>OOP<\/strong><\/td>\n<td><strong>Programaci\u00f3n Estructurada<\/strong><\/td>\n<\/tr>\n<tr>\n<td>M\u00e1s f\u00e1cil de mantener<\/td>\n<td>Dif\u00edcil de mantener<\/td>\n<\/tr>\n<tr>\n<td>No te repitas (DRY)<\/td>\n<td>C\u00f3digo repetido en muchos lugares<\/td>\n<\/tr>\n<tr>\n<td>Peque\u00f1os trozos de c\u00f3digo reutilizados en muchos lugares<\/td>\n<td>Una gran cantidad de c\u00f3digo en pocos lugares<\/td>\n<\/tr>\n<tr>\n<td>Enfoque por objetos<\/td>\n<td>Enfoque de c\u00f3digo de bloques<\/td>\n<\/tr>\n<tr>\n<td>M\u00e1s f\u00e1cil de <a href=\"https:\/\/kinsta.com\/es\/blog\/depuracion-wordpress\/\">depurar<\/a><\/td>\n<td>M\u00e1s dif\u00edcil de depurar<\/td>\n<\/tr>\n<tr>\n<td>Gran curva de aprendizaje<\/td>\n<td>Una curva de aprendizaje m\u00e1s sencilla<\/td>\n<\/tr>\n<tr>\n<td>Utilizado en <a href=\"https:\/\/kinsta.com\/es\/clientes\/\">grandes proyectos<\/a><\/td>\n<td>Optimizado para programas sencillos<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Para concluir la comparaci\u00f3n de paradigmas:<\/p>\n<ul>\n<li>Ninguno de los dos paradigmas es perfecto (la POO puede resultar abrumadora en proyectos sencillos).<\/li>\n<li>Estas son solo dos formas de resolver un problema; hay otras por ah\u00ed.<\/li>\n<li>La POO se utiliza en grandes bases de c\u00f3digo, mientras que la programaci\u00f3n estructurada es principalmente para proyectos sencillos.<\/li>\n<\/ul>\n<p>Pasemos a los objetos incorporados en Python.<\/p>\n<h2>Todo es un objeto en Python<\/h2>\n<p>Te diremos un secreto: has estado usando OOP todo el tiempo sin darte cuenta.<\/p>\n<p>Incluso cuando se utilizan otros paradigmas en Python, se siguen utilizando objetos para hacer casi todo.<\/p>\n<p>Eso es porque, en Python, <em>todo <\/em>es un objeto.<\/p>\n<p>Recuerda la definici\u00f3n de objeto: Un objeto en Python es una \u00fanica colecci\u00f3n de datos (atributos) y comportamiento (m\u00e9todos).<\/p>\n<p>Esto coincide con cualquier tipo de datos en Python.<\/p>\n<p>Una cadena es una colecci\u00f3n de datos (caracteres) y comportamientos (<strong>upper()<\/strong>, <strong>lower()<\/strong>, etc.). Lo mismo ocurre con los<strong> enteros<\/strong>, los <strong>flotantes<\/strong>, los <strong>booleanos<\/strong>, las<strong> listas <\/strong>y los diccionarios.<\/p>\n<p>Antes de continuar, repasemos el significado de los atributos y los m\u00e9todos.<\/p>\n<h3>Atributos y m\u00e9todos<\/h3>\n<p>Los atributos son <strong>variables <\/strong>internas dentro de los objetos, mientras que los m\u00e9todos son <strong>funciones <\/strong>que producen alg\u00fan comportamiento.<\/p>\n<p>Vamos a hacer un simple ejercicio en el shell de Python. Puedes abrirlo escribiendo python o python3 en tu terminal.<\/p>\n<figure id=\"attachment_97989\" aria-describedby=\"caption-attachment-97989\" style=\"width: 843px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/06\/Python-terminal.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-97989 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/06\/Python-terminal.png\" alt=\"Shell de Python\" width=\"843\" height=\"123\"><\/a><figcaption id=\"caption-attachment-97989\" class=\"wp-caption-text\">Shell de Python<\/figcaption><\/figure>\n<p>Ahora, vamos a trabajar con el <a href=\"https:\/\/kinsta.com\/es\/blog\/ssh-vs-ssl\/\">shell<\/a> de Python para descubrir m\u00e9todos y tipos.<\/p>\n<pre><code class=\"language-python\">&gt;&gt;&gt; kinsta = 'Kinsta, Premium Application, Database, and Managed WordPress hosting'\n&gt;&gt;&gt; kinsta.upper()\n'KINSTA, PREMIUM APPLICATION, DATABASE, AND MANAGED WORDPRESS HOSTING'\n<\/code><\/pre>\n<p>En la segunda l\u00ednea, estamos llamando a un m\u00e9todo de cadena, <strong>upper()<\/strong>. Devuelve el contenido de la cadena todo en may\u00fasculas. Sin embargo, no cambia la variable original.<\/p>\n<pre><code class=\"language-python\">&gt;&gt;&gt; kinsta\n'Kinsta, Premium Application, Database, and Managed WordPress hosting'\n<\/code><\/pre>\n<p>Profundicemos en las funciones valiosas cuando se trabaja con objetos.<\/p>\n<p>La funci\u00f3n <strong>type() <\/strong>permite obtener el tipo de un objeto. El \u00abtipo\u00bb es la clase a la que pertenece el objeto.<\/p>\n<pre><code class=\"language-python\">&gt;&gt;&gt; type(kinsta)\n# class 'str'\n<\/code><\/pre>\n<p>La funci\u00f3n <strong>dir() <\/strong>devuelve todos los atributos y m\u00e9todos de un objeto. Vamos a probarlo con la variable <strong>kinsta<\/strong>.<\/p>\n<pre><code class=\"language-python\">&gt;&gt;&gt; dir(ki<span id=\"urn:enhancement-8\" class=\"textannotation\">nsta)\n<\/span>['__add__', '__class__',  ........... 'upper', 'zfill']\n<\/code><\/pre>\n<p>Ahora, intenta imprimir algunos de los atributos ocultos de este objeto.<\/p>\n<pre><code class=\"language-python\"> &gt;&gt;&gt; kinsta.__class__ # class \u2018str\u2019 e&gt;<\/code><\/pre>\n<p>Esto devolver\u00e1 la clase a la que pertenece el objeto <strong>kinsta<\/strong>. As\u00ed que podemos decir que lo \u00fanico que devuelve la funci\u00f3n <strong>type <\/strong>es el atributo <strong>__class__ <\/strong>de un objeto.<\/p>\n<p>Puedes experimentar con todos los tipos de datos, descubriendo todos sus atributos y m\u00e9todos directamente en el terminal. Puedes obtener m\u00e1s informaci\u00f3n sobre los tipos de datos incorporados en la <a href=\"https:\/\/docs.python.org\/3\/library\/stdtypes.html\">documentaci\u00f3n oficial<\/a>.<\/p>\n<h2>Tu primer objeto en Python<\/h2>\n<p>Una <strong>clase <\/strong>es como una plantilla<strong>.<\/strong> Te permite crear objetos personalizados basados en los atributos y m\u00e9todos que definas.<\/p>\n<p>Puedes pensar en \u00e9l como un <strong>cortador de galletas <\/strong>que modificas para hornear las galletas perfectas (objetos, no <a href=\"https:\/\/kinsta.com\/es\/blog\/wordpress-cookies-sesiones-php\/\">galletas de seguimiento<\/a>), con caracter\u00edsticas definidas: Forma, tama\u00f1o y otros.<\/p>\n<p>Por otro lado, tenemos las <strong>instancias. <\/strong>Una instancia es un objeto individual de una clase, que tiene una direcci\u00f3n de memoria \u00fanica.<\/p>\n<figure id=\"attachment_97990\" aria-describedby=\"caption-attachment-97990\" style=\"width: 1024px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/06\/Kinsta-Instances.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-97990 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/06\/Kinsta-Instances.png\" alt=\"Instancias en Python\" width=\"1024\" height=\"512\"><\/a><figcaption id=\"caption-attachment-97990\" class=\"wp-caption-text\">Instancias en Python<\/figcaption><\/figure>\n<p>Ahora que sabes lo que son las clases y las instancias, \u00a1definamos algunas!<\/p>\n<p>Para definir una clase en Python, se utiliza la palabra clave <strong>class<\/strong>, seguida de su nombre. En este caso, crear\u00e1s una clase llamada <strong>Cookie<\/strong>.<\/p>\n<p><strong>Nota: <\/strong>En Python, utilizamos la <a href=\"https:\/\/en.wikipedia.org\/wiki\/Camel_case#:~:text=Camel%20case%20(sometimes%20stylized%20as,word%20starting%20with%20either%20case.\">convenci\u00f3n de nombres en may\u00fasculas<\/a> para nombrar las clases.<\/p>\n<pre><code class=\"language-python\">class Cookie:\n\tpass\n<\/code><\/pre>\n<p>Abre tu shell de Python y escribe el c\u00f3digo anterior. Para crear una instancia de una clase, solo tienes que escribir su nombre y un par\u00e9ntesis despu\u00e9s. Es el mismo proceso que invocar una funci\u00f3n.<\/p>\n<pre><code class=\"language-python\">cookie1 = Cookie()\n<\/code><\/pre>\n<p>Enhorabuena: \u00a1acabas de crear tu primer objeto en Python! Puedes comprobar su id y tipo con el siguiente c\u00f3digo:<\/p>\n<pre><code class=\"language-python\">id(cookie1)\n140130610977040 # Unique identifier of the object\n\ntype(cookie1)\n&lt;class '__main__.Cookie'&gt;\n<\/code><\/pre>\n<p>Como puedes ver, esta cookie tiene un identificador \u00fanico en la memoria, y su tipo es <strong>Cookie<\/strong>.<\/p>\n<p>Tambi\u00e9n puedes comprobar si un objeto es una instancia de una clase con la funci\u00f3n <strong>isinstance()<\/strong>.<\/p>\n<pre><code class=\"language-python\">isinstance(cookie1, Cookie)\n# True\nisinstance(cookie1, int)\n# False\nisinstance('a string', Cookie)\n# False\n<\/code><\/pre>\n<h3>M\u00e9todo constructor<\/h3>\n<p>El m\u00e9todo <strong>__init__() <\/strong>tambi\u00e9n se llama \u00abconstructor\u00bb. Es llamado por Python cada vez que instanciamos un objeto.<\/p>\n<p>El <a href=\"https:\/\/kinsta.com\/es\/blog\/php-8\/#constructor-property-promotion\">constructor<\/a> crea el estado inicial del objeto con el conjunto m\u00ednimo de par\u00e1metros que necesita para existir. Modifiquemos la clase <strong>Cookie<\/strong>, para que acepte par\u00e1metros en tu constructor.<\/p>\n<pre><code class=\"language-python\">class Cookie:\n\t# Constructor\n\tdef __init__(self, name, shape, chips='Chocolate'):\n\t\t# Instance attributes\n\t\tself.name = name\n\t\tself.shape = shape\n\t\tself.chips = chips\n<\/code><\/pre>\n<p>En la clase <strong>Cookie<\/strong>, cada cookie debe tener un nombre, una forma y unas virutas. Hemos definido esta \u00faltima como \u00abChocolate\u00bb.<\/p>\n<p>Por otro lado, <strong>self <\/strong>se refiere a la instancia de la clase (el objeto en s\u00ed).<\/p>\n<p>Intenta pegar la clase en el shell y crea una instancia de la cookie como de costumbre.<\/p>\n<pre><code class=\"language-python\">cookie2 = Cookie()\n# TypeError\n<\/code><\/pre>\n<p>Obtendr\u00e1s un error. Esto se debe a que debes proporcionar el conjunto m\u00ednimo de datos que el objeto necesita para vivir &#8211; en este caso, el <strong>nombre <\/strong>y la <strong>forma<\/strong>, ya que hemos establecido <strong>chips <\/strong>y \u00abChocolate\u00bb.<\/p>\n<pre><code class=\"language-python\">cookie2 = Cookie('Awesome cookie', 'Star')\n<\/code><\/pre>\n<p>Para acceder a los atributos de una instancia, debes utilizar la notaci\u00f3n de puntos.<\/p>\n<pre><code class=\"language-python\">cookie2.name\n# 'Awesome cookie'\ncookie2.shape\n# 'Star'\ncookie2.chips\n# 'Chocolate'\n<\/code><\/pre>\n<p>Por ahora, la clase <strong>Cookie <\/strong>no tiene nada demasiado jugoso. Vamos a a\u00f1adir un m\u00e9todo de ejemplo <strong>bake() <\/strong>para hacer las cosas m\u00e1s interesantes.<\/p>\n<pre><code class=\"language-python\">class Cookie:\n\t# Constructor\n\tdef __init__(self, name, shape, chips='Chocolate'):\n\t\t# Instance attributes\n\t\tself.name = name\n\t\tself.shape = shape\n\t\tself.chips = chips\n\n\t# The object is passing itself as a parameter\n\tdef bake(self):\n\t\tprint(f'This {self.name}, is being baked with the shape {self.shape} and chips of {self.chips}')\n\t\tprint('Enjoy your cookie!')\n<\/code><\/pre>\n<p>Para llamar a un m\u00e9todo, utiliza la notaci\u00f3n de puntos e inv\u00f3calo como una funci\u00f3n.<\/p>\n<pre><code class=\"language-python\">cookie3 = Cookie('Baked cookie', 'Tree')\ncookie3.bake()\n# This Baked cookie, is being baked with the shape Tree and chips of Chocolate\nEnjoy your cookie!\n<\/code><\/pre>\n<h2>Los 4 pilares de la OOP en Python<\/h2>\n<p>La programaci\u00f3n orientada a objetos incluye cuatro pilares principales:<\/p>\n<h4>1. Abstracci\u00f3n<\/h4>\n<p>La abstracci\u00f3n oculta al usuario la funcionalidad interna de una aplicaci\u00f3n. El usuario puede ser el cliente final u otros desarrolladores.<\/p>\n<p>Podemos encontrar <strong>abstracci\u00f3n <\/strong>en nuestra vida cotidiana. Por ejemplo, sabes c\u00f3mo usar tu tel\u00e9fono, pero probablemente no sepas exactamente lo que ocurre dentro de \u00e9l cada vez que abres una aplicaci\u00f3n.<\/p>\n<p>Otro ejemplo es el propio Python. Sabes c\u00f3mo usarlo para construir <a href=\"https:\/\/kinsta.com\/es\/blog\/software-cms\/\">software funcional<\/a>, y puedes hacerlo aunque no entiendas el funcionamiento interno de Python.<\/p>\n<p>Aplicar lo mismo al c\u00f3digo permite reunir todos los objetos de un problema y <strong>abstraer la <\/strong>funcionalidad est\u00e1ndar en clases.<\/p>\n<h4>2. Herencia<\/h4>\n<p>La herencia nos permite definir m\u00faltiples <strong>subclases <\/strong>a partir de una clase ya definida.<\/p>\n<p>El prop\u00f3sito principal es seguir el <a href=\"https:\/\/en.wikipedia.org\/wiki\/Don%27t_repeat_yourself\">principio DRY<\/a>. Podr\u00e1s reutilizar mucho c\u00f3digo implementando todos los componentes compartidos en <strong>superclases<\/strong>.<\/p>\n<p>Puedes pensar en ello como el concepto de <strong>herencia gen\u00e9tica <\/strong>en la vida real. Los <a href=\"https:\/\/kinsta.com\/es\/blog\/temas-child-wordpress\/\">hijos<\/a> (subclases) son el resultado de la herencia entre dos padres (superclases). Heredan todas las caracter\u00edsticas f\u00edsicas (atributos) y algunos comportamientos comunes (m\u00e9todos).<\/p>\n<h4>3. Polimorfismo<\/h4>\n<p>El polimorfismo nos permite modificar ligeramente los m\u00e9todos y atributos de las <strong>subclases <\/strong>previamente definidas en la <strong>superclase<\/strong>.<\/p>\n<p>El significado literal es \u00ab<strong>muchas formas<\/strong>\u00ab. Esto se debe a que construimos m\u00e9todos con el mismo nombre pero con diferente funcionalidad.<\/p>\n<p>Volviendo a la idea anterior, los ni\u00f1os tambi\u00e9n son un ejemplo perfecto de polimorfismo. Pueden heredar un comportamiento definido <strong>get_hungry() <\/strong>pero de una manera ligeramente diferente, por ejemplo, tener hambre cada 4 horas en lugar de cada 6.<\/p>\n<h4>4. Encapsulaci\u00f3n<\/h4>\n<p>La encapsulaci\u00f3n es el proceso en el que protegemos la integridad interna de los datos en una clase.<\/p>\n<p>Aunque no hay una declaraci\u00f3n <strong>privada <\/strong>en Python, se puede aplicar la encapsulaci\u00f3n mediante el uso de <a href=\"https:\/\/en.wikipedia.org\/wiki\/Name_mangling#Python\">mangling en Python<\/a>. Existen m\u00e9todos especiales llamados <strong>getters <\/strong>y <strong>setters <\/strong>que nos permiten acceder a atributos y m\u00e9todos \u00fanicos.<\/p>\n<p>Imaginemos una clase <strong>Humana <\/strong>que tiene un \u00fanico atributo llamado <strong>_altura<\/strong>. Este atributo solo se puede modificar dentro de ciertas restricciones (es casi imposible ser m\u00e1s alto que 3 metros).<\/p>\n<h2>Construir una calculadora de resoluci\u00f3n de formas de \u00e1rea<\/h2>\n<p>Una de las mejores cosas de Python es que nos permite crear una gran variedad de software, desde un programa <a href=\"https:\/\/kinsta.com\/es\/docs\/devkinsta\/wp-cli\/\">CLI (interfaz de l\u00ednea de comandos)<\/a> hasta una compleja aplicaci\u00f3n web.<\/p>\n<p>Ahora que has aprendido los conceptos fundamentales de la programaci\u00f3n orientada a objetos, es el momento de aplicarlos en un proyecto real.<\/p>\n<p><strong>Nota: <\/strong>Todo el c\u00f3digo siguiente estar\u00e1 disponible dentro de este <a href=\"https:\/\/github.com\/DaniDiazTech\/Object-Oriented-Programming-in-Python\/blob\/main\/shape_calculator\/calculator.py\">repositorio de GitHub<\/a>. Una <a href=\"https:\/\/kinsta.com\/es\/blog\/herramientas-de-revision-de-codigo\/#3-github\">herramienta de revisi\u00f3n de c\u00f3digo<\/a> que nos ayuda a gestionar las versiones del c\u00f3digo con Git.<\/p>\n<p>Tu tarea es crear una calculadora de \u00e1reas de las siguientes formas:<\/p>\n<ul>\n<li>Cuadrado<\/li>\n<li>Rect\u00e1ngulo<\/li>\n<li>Tri\u00e1ngulo<\/li>\n<li>C\u00edrculo<\/li>\n<li>Hex\u00e1gono<\/li>\n<\/ul>\n<h3>Clase de base de la forma<\/h3>\n<p>En primer lugar, crea un archivo <strong>calculator.py <\/strong>y \u00e1brelo. Como ya tenemos los objetos para trabajar, ser\u00e1 f\u00e1cil <strong>abstraction<\/strong>\u00a0en una clase.<\/p>\n<p>Puedes analizar las caracter\u00edsticas comunes y descubrir que todas ellas son <strong>formas 2D<\/strong>. Por lo tanto, la mejor opci\u00f3n es crear una clase <strong>Shape <\/strong>con un m\u00e9todo <strong>get_area() <\/strong>del que heredar\u00e1 cada forma.<\/p>\n<p><strong>Nota: <\/strong>Todos los m\u00e9todos deben ser verbos. Eso es porque este m\u00e9todo se llama <strong>get_area() <\/strong>y no <strong>area()<\/strong>.<\/p>\n<pre><code class=\"language-python\">class Shape:\n\tdef __init__(self):\n\t\tpass\n\n\tdef get_area(self):\n\t\tpass\n<\/code><\/pre>\n<p>El c\u00f3digo anterior define la clase; sin embargo, todav\u00eda no hay nada interesante en ella.<\/p>\n<p>Vamos a implementar la funcionalidad est\u00e1ndar de la mayor\u00eda de estas formas.<\/p>\n<pre><code class=\"language-python\">class Shape:\n\tdef __init__(self, side1, side2):\n\t\tself.side1 = side1\n\t\tself.side2 = side2\n\n\tdef get_area(self):\n\t\treturn self.side1 * self.side2\n\n\tdef __str__(self):\n\t\treturn f'The area of this {self.__class__.__name__} is: {self.get_area()}'\n<\/code><\/pre>\n<p>Vamos a desglosar lo que estamos haciendo con este c\u00f3digo:<\/p>\n<ul>\n<li>En el m\u00e9todo <strong>__init__<\/strong>, estamos solicitando dos par\u00e1metros, <strong>side1 <\/strong>y <strong>side2<\/strong>. Estos permanecer\u00e1n como <strong>atributos de la instancia<\/strong>.<\/li>\n<li>La funci\u00f3n <strong>get_area() <\/strong>devuelve el \u00e1rea de la forma. En este caso, utiliza la f\u00f3rmula del \u00e1rea de un rect\u00e1ngulo, ya que ser\u00e1 m\u00e1s f\u00e1cil de implementar con otras formas.<\/li>\n<li>El m\u00e9todo <strong>__str__() <\/strong>es un \u00abm\u00e9todo m\u00e1gico\u00bb al igual que <strong>__init__(). <\/strong>Permite modificar la forma en que se imprimir\u00e1 una instancia.<\/li>\n<li>El atributo oculto <strong>self.__class__.__name__ <\/strong>se refiere al nombre de la clase. Si estuvieras trabajando con una clase <b>Triangle<\/b>, ese atributo ser\u00eda \u00abTriangule\u00bb.<\/li>\n<\/ul>\n<h3>Clase Rect\u00e1ngulo<\/h3>\n<p>Ya que implementamos la f\u00f3rmula del \u00e1rea del Rect\u00e1ngulo, podr\u00edamos crear una simple clase <b>Rectangle<\/b>\u00a0que no hace m\u00e1s que heredar de la clase <strong>Shape<\/strong>.<\/p>\n<p>Para aplicar la<strong> herencia <\/strong>en Python, crear\u00e1s una clase como de costumbre y rodear\u00e1s la <strong>superclase <\/strong>de la que quieres heredar con par\u00e9ntesis.<\/p>\n<pre><code class=\"language-python\"># Folded base class\nclass Shape: ...\n \nclass Rectangle(Shape): # Superclass in Parenthesis\n\tpass\n<\/code><\/pre>\n<h3>Clase cuadrada<\/h3>\n<p>Podemos hacer una excelente aproximaci\u00f3n al <strong>polimorfismo <\/strong>con la clase <strong>Square<\/strong>.<\/p>\n<p>Recuerda que un cuadrado es solo un rect\u00e1ngulo cuyos cuatro lados son iguales. Eso significa que podemos utilizar la misma f\u00f3rmula para obtener el \u00e1rea.<\/p>\n<p>Podemos hacerlo modificando el m\u00e9todo <strong>init<\/strong>, aceptando solo un <b>side\u00a0<\/b>como par\u00e1metro, y pasando ese valor del lado al constructor de la clase <strong>Rectangle<\/strong>.<\/p>\n<pre><code class=\"language-python\"># Folded classes\nclass Shape: ...\nclass Rectangle(Shape): ...\n \nclass Square(Rectangle):\n\tdef __init__(self, side):\n\t\tsuper().__init__(side, side)\n<\/code><\/pre>\n<p>Como puedes ver, la <a href=\"https:\/\/docs.python.org\/3\/library\/functions.html#super\">funci\u00f3n super<\/a> pasa el par\u00e1metro side dos veces a la <strong>superclase<\/strong>. En otras palabras, est\u00e1 pasando <strong>side <\/strong>tanto como <strong>side1 <\/strong>como <strong>side2 <\/strong>al constructor previamente definido.<\/p>\n<h3>Clase de tri\u00e1ngulo<\/h3>\n<p>Un tri\u00e1ngulo es la mitad de grande que el rect\u00e1ngulo que lo rodea.<\/p>\n<figure id=\"attachment_97994\" aria-describedby=\"caption-attachment-97994\" style=\"width: 300px\" class=\"wp-caption alignnone\"><a style=\"font-size: 1rem\" href=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/06\/Triangle-formula.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-97994 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/06\/Triangle-formula.png\" alt=\"Relaci\u00f3n entre tri\u00e1ngulos y rect\u00e1ngulos (Fuente de la imagen: Varsity tutors).\" width=\"300\" height=\"200\"><\/a><figcaption id=\"caption-attachment-97994\" class=\"wp-caption-text\">Relaci\u00f3n entre tri\u00e1ngulos y rect\u00e1ngulos (Fuente de la imagen: Varsity tutors).<\/figcaption><\/figure>\n<p>Por lo tanto, podemos heredar de la clase <strong>Rectangle <\/strong>y modificar el m\u00e9todo <strong>get_area <\/strong>para que coincida con la f\u00f3rmula del \u00e1rea del tri\u00e1ngulo, que es la mitad de la base multiplicada por la altura.<\/p>\n<pre><code class=\"language-python\"># Folded classes\nclass Shape: ...\nclass Rectangle(Shape): ...\nclass Square(Rectangle): ...\n \nclass Triangle(Rectangle):\n\tdef __init__(self, base, height):\n\t\tsuper().__init__(base, height)\n \n\tdef get_area(self):\n\t\tarea = super().get_area()\n\t\treturn area \/ 2\n<\/code><\/pre>\n<p>Otro caso de uso de la funci\u00f3n <strong>super() <\/strong>es llamar a un m\u00e9todo definido en la <strong>superclase <\/strong>y almacenar el resultado como una variable. Eso es lo que ocurre dentro del m\u00e9todo <strong>get_area()<\/strong>.<\/p>\n<h3>Clase circular<\/h3>\n<p>Puedes encontrar el \u00e1rea del c\u00edrculo con la f\u00f3rmula <strong>\u03c0r\u00b2<\/strong>, donde <strong>r <\/strong>es el radio del c\u00edrculo. Eso significa que tenemos que modificar el m\u00e9todo <strong>get_area() <\/strong>para implementar esa f\u00f3rmula.<\/p>\n<p><strong>Nota: <\/strong>Podemos importar el valor aproximado de \u03c0 desde el m\u00f3dulo matem\u00e1tico<\/p>\n<pre><code class=\"language-python\"># Folded classes\nclass Shape: ...\nclass Rectangle(Shape): ...\nclass Square(Rectangle): ...\nclass Triangle(Rectangle): \u2026\n \n# At the start of the file\nfrom math import pi\n \nclass Circle(Shape):\n\tdef __init__(self, radius):\n\t\tself.radius = radius\n \n\tdef get_area(self):\n\t\treturn pi * (self.radius ** 2)\n<\/code><\/pre>\n<p>El c\u00f3digo anterior define la clase <strong>Circle<\/strong>, que utiliza un constructor y m\u00e9todos <strong>get_area() <\/strong>diferentes.<\/p>\n<p>Aunque <strong>Circle <\/strong>hereda de la clase <strong>Shape<\/strong>, puedes redefinir cada m\u00e9todo y atribuirlo a tu gusto.<\/p>\n<h3>Clase Hex\u00e1gono Regular<\/h3>\n<p>Solo necesitamos la longitud de un lado de un hex\u00e1gono regular para calcular su \u00e1rea. Es similar a la clase <strong>Square<\/strong>, donde solo pasamos un argumento al constructor.<\/p>\n<figure id=\"attachment_97996\" aria-describedby=\"caption-attachment-97996\" style=\"width: 300px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/06\/Hexagon-formula.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-97996 size-medium\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/06\/Hexagon-formula-300x165.png\" alt=\"F\u00f3rmula del \u00e1rea del hex\u00e1gono (Fuente de la imagen: BYJU'S)\" width=\"300\" height=\"165\"><\/a><figcaption id=\"caption-attachment-97996\" class=\"wp-caption-text\">F\u00f3rmula del \u00e1rea del hex\u00e1gono (Fuente de la imagen: BYJU&#8217;S)<\/figcaption><\/figure>\n<p>Sin embargo, la f\u00f3rmula es bastante diferente, e implica el uso de una ra\u00edz cuadrada. Por eso se utilizar\u00e1 la funci\u00f3n <strong>sqrt() <\/strong>del m\u00f3dulo matem\u00e1tico.<\/p>\n<pre><code class=\"language-python\"># Folded classes\nclass Shape: ...\nclass Rectangle(Shape): ...\nclass Square(Rectangle): ...\nclass Triangle(Rectangle): \u2026\nclass Circle(Shape): \u2026\n \n# Import square root\nfrom math import sqrt\n \nclass Hexagon(Rectangle):\n\t\n\tdef get_area(self):\n\t\treturn (3 * sqrt(3) * self.side1 ** 2) \/ 2\n<\/code><\/pre>\n<h3>Probar nuestras clases<\/h3>\n<p>Puedes entrar en un modo interactivo cuando ejecutas un archivo de Python utilizando un depurador. La forma m\u00e1s sencilla de hacerlo es utilizando la funci\u00f3n de <a href=\"https:\/\/docs.python.org\/3\/library\/functions.html#breakpoint\">punto de interrupci\u00f3n<\/a> incorporada.<\/p>\n<p><strong>Nota: <\/strong>Esta funci\u00f3n solo est\u00e1 disponible en Python 3.7 o superior.<\/p>\n<pre><code class=\"language-python\">from math import pi, sqrt\n# Folded classes\nclass Shape: ...\nclass Rectangle(Shape): ...\nclass Square(Rectangle): ...\nclass Triangle(Rectangle): \u2026\nclass Circle(Shape): \u2026\nclass Hexagon(Rectangle): \u2026\n \nbreakpoint()\n<\/code><\/pre>\n<p>Ahora, ejecuta el archivo Python y juega con las clases que has creado.<\/p>\n<pre><code class=\"language-python\">$ python calculator.py\n \n(Pdb) rec = Rectangle(1, 2)(Pdb) print(rec)\nThe area of this Rectangle is: 2\n(Pdb) sqr = Square(4)\n(Pdb) print(sqr)\nThe area of this Square is: 16\n(Pdb) tri = Triangle(2, 3)\n(Pdb) print(tri)\nThe area of this Triangle is: 3.0\n(Pdb) cir = Circle(4)\n(Pdb) print(cir)\nThe area of this Circle is: 50.26548245743669\n(Pdb) hex = Hexagon(3)\n(Pdb) print(hex)\nThe area of this Hexagon is: 23.382685902179844\n<\/code><\/pre>\n<h3>Desaf\u00edo<\/h3>\n<p>Crear una clase con un m\u00e9todo de <strong>run <\/strong>donde el usuario pueda elegir una forma y calcular su \u00e1rea.<\/p>\n<p>Cuando hayas completado el reto, puedes enviar una solicitud de extracci\u00f3n al <a href=\"https:\/\/kinsta.com\/es\/blog\/git-vs-github\/\">repositorio de GitHub<\/a> o publicar tu soluci\u00f3n en la secci\u00f3n de comentarios.<\/p>\n\n<kinsta-video src=\"https:\/\/www.youtube.com\/watch?v=vmNem6wxfSQ\"><\/kinsta-video>\n<h2>Resumen<\/h2>\n<p>La programaci\u00f3n orientada a objetos es un paradigma en el que resolvemos problemas pensando en ellos como <strong>objetos<\/strong>. Si entiendes la POO de Python, tambi\u00e9n puedes aplicarla f\u00e1cilmente en lenguajes como <a href=\"https:\/\/kinsta.com\/es\/blog\/mejor-lenguaje-de-programacion-para-aprender\/#java\">Java<\/a>, <a href=\"https:\/\/kinsta.com\/es\/blog\/que-es-php\/\">PHP<\/a>, Javascript y <a href=\"https:\/\/kinsta.com\/es\/blog\/mejor-lenguaje-de-programacion-para-aprender\/#c-1\">C#<\/a>.<\/p>\n<p>En este art\u00edculo, has aprendido sobre:<\/p>\n<ul>\n<li>El concepto de orientaci\u00f3n a objetos en Python<\/li>\n<li>Ventajas de la programaci\u00f3n orientada a objetos sobre la estructurada<\/li>\n<li>Fundamentos de la programaci\u00f3n orientada a objetos en Python<\/li>\n<li>Concepto de <strong>clases <\/strong>y c\u00f3mo utilizarlas en Python<\/li>\n<li>El <strong>constructor <\/strong>de una clase en Python<\/li>\n<li><strong>M\u00e9todos <\/strong>y <strong>atributos <\/strong>en Python<\/li>\n<li>Los cuatro pilares de la POO<\/li>\n<li>Implementaci\u00f3n de la<strong> abstracci\u00f3n<\/strong>, la <strong>herencia <\/strong>y el <strong>polimorfismo <\/strong>en un proyecto<\/li>\n<\/ul>\n<p>Ahora te toca a ti.<\/p>\n<p><em>D\u00e9janos tu soluci\u00f3n al desaf\u00edo en los comentarios. Y no olvides consultar nuestra <a href=\"https:\/\/kinsta.com\/es\/blog\/php-vs-python\/\">gu\u00eda de comparaci\u00f3n entre Python y PHP<\/a>.<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>La programaci\u00f3n es un arte. Y al igual que en el arte, la selecci\u00f3n de los pinceles y pinturas adecuados es esencial para producir las mejores &#8230;<\/p>\n","protected":false},"author":181,"featured_media":42599,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[666,822],"topic":[1320],"class_list":["post-42596","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-programming","tag-python","topic-python"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Gu\u00eda Programaci\u00f3n Orientada a Objetos (POO) en Python<\/title>\n<meta name=\"description\" content=\"Aprende los detalles de la Programaci\u00f3n orientada a objetos (POO) en Python. Lo cubriremos desde el concepto hasta la implementaci\u00f3n con muchos ejemplos.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/es\/blog\/programacion-orientada-objetos-python\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Gu\u00eda para Principiantes de la Programaci\u00f3n Orientada a Objetos (POO) en Python\" \/>\n<meta property=\"og:description\" content=\"Aprende los detalles de la Programaci\u00f3n orientada a objetos (POO) en Python. Lo cubriremos desde el concepto hasta la implementaci\u00f3n con muchos ejemplos.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/es\/blog\/programacion-orientada-objetos-python\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinsta.es\/\" \/>\n<meta property=\"article:published_time\" content=\"2021-07-21T09:27:17+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-02-11T08:59:56+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2021\/07\/python-object-oriented-programming.jpeg\" \/>\n\t<meta property=\"og:image:width\" content=\"1460\" \/>\n\t<meta property=\"og:image:height\" content=\"730\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Daniel Diaz\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Aprende los detalles de la Programaci\u00f3n orientada a objetos (POO) en Python. Lo cubriremos desde el concepto hasta la implementaci\u00f3n con muchos ejemplos.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2021\/07\/python-object-oriented-programming.jpeg\" \/>\n<meta name=\"twitter:creator\" content=\"@DaniDiazTech\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_ES\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Daniel Diaz\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"20 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/programacion-orientada-objetos-python\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/programacion-orientada-objetos-python\/\"},\"author\":{\"name\":\"Daniel Diaz\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/person\/38f3b6be2225ef58d7914f1b6a70fcb2\"},\"headline\":\"Gu\u00eda para Principiantes de la Programaci\u00f3n Orientada a Objetos (POO) en Python\",\"datePublished\":\"2021-07-21T09:27:17+00:00\",\"dateModified\":\"2025-02-11T08:59:56+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/programacion-orientada-objetos-python\/\"},\"wordCount\":3925,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/es\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/programacion-orientada-objetos-python\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2021\/07\/python-object-oriented-programming.jpeg\",\"keywords\":[\"programming\",\"python\"],\"articleSection\":[\"Sin Categor\u00eda\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/es\/blog\/programacion-orientada-objetos-python\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/programacion-orientada-objetos-python\/\",\"url\":\"https:\/\/kinsta.com\/es\/blog\/programacion-orientada-objetos-python\/\",\"name\":\"Gu\u00eda Programaci\u00f3n Orientada a Objetos (POO) en Python\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/es\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/programacion-orientada-objetos-python\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/programacion-orientada-objetos-python\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2021\/07\/python-object-oriented-programming.jpeg\",\"datePublished\":\"2021-07-21T09:27:17+00:00\",\"dateModified\":\"2025-02-11T08:59:56+00:00\",\"description\":\"Aprende los detalles de la Programaci\u00f3n orientada a objetos (POO) en Python. Lo cubriremos desde el concepto hasta la implementaci\u00f3n con muchos ejemplos.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/programacion-orientada-objetos-python\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/es\/blog\/programacion-orientada-objetos-python\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/programacion-orientada-objetos-python\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2021\/07\/python-object-oriented-programming.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2021\/07\/python-object-oriented-programming.jpeg\",\"width\":1460,\"height\":730,\"caption\":\"Gu\u00eda para principiantes de la programaci\u00f3n orientada a objetos (POO) en Python\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/programacion-orientada-objetos-python\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/es\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Python\",\"item\":\"https:\/\/kinsta.com\/es\/secciones\/python\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Gu\u00eda para Principiantes de la Programaci\u00f3n Orientada a Objetos (POO) en Python\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/es\/#website\",\"url\":\"https:\/\/kinsta.com\/es\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Soluciones de alojamiento premium, r\u00e1pidas y seguras\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/es\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/es\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/es\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/es\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinsta.es\/\",\"https:\/\/x.com\/Kinsta_ES\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/person\/38f3b6be2225ef58d7914f1b6a70fcb2\",\"name\":\"Daniel Diaz\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/4541784060a3b28ffb67a5da67b1f7e7?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/4541784060a3b28ffb67a5da67b1f7e7?s=96&d=mm&r=g\",\"caption\":\"Daniel Diaz\"},\"description\":\"Daniel is a self-taught Python Developer, Technical Writer, and long-life learner. He enjoys creating software from scratch and explaining this process through stunning articles. Follow him on Twitter: @DaniDiazTech\",\"sameAs\":[\"https:\/\/developerroad.herokuapp.com\/\",\"https:\/\/www.linkedin.com\/in\/danidiaztech\",\"https:\/\/x.com\/DaniDiazTech\"],\"url\":\"https:\/\/kinsta.com\/es\/blog\/author\/danidiaztech\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Gu\u00eda Programaci\u00f3n Orientada a Objetos (POO) en Python","description":"Aprende los detalles de la Programaci\u00f3n orientada a objetos (POO) en Python. Lo cubriremos desde el concepto hasta la implementaci\u00f3n con muchos ejemplos.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinsta.com\/es\/blog\/programacion-orientada-objetos-python\/","og_locale":"es_ES","og_type":"article","og_title":"Gu\u00eda para Principiantes de la Programaci\u00f3n Orientada a Objetos (POO) en Python","og_description":"Aprende los detalles de la Programaci\u00f3n orientada a objetos (POO) en Python. Lo cubriremos desde el concepto hasta la implementaci\u00f3n con muchos ejemplos.","og_url":"https:\/\/kinsta.com\/es\/blog\/programacion-orientada-objetos-python\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinsta.es\/","article_published_time":"2021-07-21T09:27:17+00:00","article_modified_time":"2025-02-11T08:59:56+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2021\/07\/python-object-oriented-programming.jpeg","type":"image\/jpeg"}],"author":"Daniel Diaz","twitter_card":"summary_large_image","twitter_description":"Aprende los detalles de la Programaci\u00f3n orientada a objetos (POO) en Python. Lo cubriremos desde el concepto hasta la implementaci\u00f3n con muchos ejemplos.","twitter_image":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2021\/07\/python-object-oriented-programming.jpeg","twitter_creator":"@DaniDiazTech","twitter_site":"@Kinsta_ES","twitter_misc":{"Escrito por":"Daniel Diaz","Tiempo de lectura":"20 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/es\/blog\/programacion-orientada-objetos-python\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/es\/blog\/programacion-orientada-objetos-python\/"},"author":{"name":"Daniel Diaz","@id":"https:\/\/kinsta.com\/es\/#\/schema\/person\/38f3b6be2225ef58d7914f1b6a70fcb2"},"headline":"Gu\u00eda para Principiantes de la Programaci\u00f3n Orientada a Objetos (POO) en Python","datePublished":"2021-07-21T09:27:17+00:00","dateModified":"2025-02-11T08:59:56+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/es\/blog\/programacion-orientada-objetos-python\/"},"wordCount":3925,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/es\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/es\/blog\/programacion-orientada-objetos-python\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2021\/07\/python-object-oriented-programming.jpeg","keywords":["programming","python"],"articleSection":["Sin Categor\u00eda"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/es\/blog\/programacion-orientada-objetos-python\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/es\/blog\/programacion-orientada-objetos-python\/","url":"https:\/\/kinsta.com\/es\/blog\/programacion-orientada-objetos-python\/","name":"Gu\u00eda Programaci\u00f3n Orientada a Objetos (POO) en Python","isPartOf":{"@id":"https:\/\/kinsta.com\/es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/es\/blog\/programacion-orientada-objetos-python\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/es\/blog\/programacion-orientada-objetos-python\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2021\/07\/python-object-oriented-programming.jpeg","datePublished":"2021-07-21T09:27:17+00:00","dateModified":"2025-02-11T08:59:56+00:00","description":"Aprende los detalles de la Programaci\u00f3n orientada a objetos (POO) en Python. Lo cubriremos desde el concepto hasta la implementaci\u00f3n con muchos ejemplos.","breadcrumb":{"@id":"https:\/\/kinsta.com\/es\/blog\/programacion-orientada-objetos-python\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/es\/blog\/programacion-orientada-objetos-python\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinsta.com\/es\/blog\/programacion-orientada-objetos-python\/#primaryimage","url":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2021\/07\/python-object-oriented-programming.jpeg","contentUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2021\/07\/python-object-oriented-programming.jpeg","width":1460,"height":730,"caption":"Gu\u00eda para principiantes de la programaci\u00f3n orientada a objetos (POO) en Python"},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/es\/blog\/programacion-orientada-objetos-python\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/es\/"},{"@type":"ListItem","position":2,"name":"Python","item":"https:\/\/kinsta.com\/es\/secciones\/python\/"},{"@type":"ListItem","position":3,"name":"Gu\u00eda para Principiantes de la Programaci\u00f3n Orientada a Objetos (POO) en Python"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/es\/#website","url":"https:\/\/kinsta.com\/es\/","name":"Kinsta\u00ae","description":"Soluciones de alojamiento premium, r\u00e1pidas y seguras","publisher":{"@id":"https:\/\/kinsta.com\/es\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/es\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/es\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinsta.es\/","https:\/\/x.com\/Kinsta_ES","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/es\/#\/schema\/person\/38f3b6be2225ef58d7914f1b6a70fcb2","name":"Daniel Diaz","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinsta.com\/es\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/4541784060a3b28ffb67a5da67b1f7e7?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/4541784060a3b28ffb67a5da67b1f7e7?s=96&d=mm&r=g","caption":"Daniel Diaz"},"description":"Daniel is a self-taught Python Developer, Technical Writer, and long-life learner. He enjoys creating software from scratch and explaining this process through stunning articles. Follow him on Twitter: @DaniDiazTech","sameAs":["https:\/\/developerroad.herokuapp.com\/","https:\/\/www.linkedin.com\/in\/danidiaztech","https:\/\/x.com\/DaniDiazTech"],"url":"https:\/\/kinsta.com\/es\/blog\/author\/danidiaztech\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts\/42596","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/users\/181"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/comments?post=42596"}],"version-history":[{"count":13,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts\/42596\/revisions"}],"predecessor-version":[{"id":66945,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts\/42596\/revisions\/66945"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/42596\/translations\/en"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/42596\/translations\/fr"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/42596\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/42596\/translations\/pt"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/42596\/translations\/es"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/42596\/translations\/nl"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/42596\/translations\/de"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/42596\/translations\/se"},{"href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/42596\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/media\/42599"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/media?parent=42596"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/tags?post=42596"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/topic?post=42596"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}