{"id":151,"date":"2020-06-12T19:40:18","date_gmt":"2020-06-12T17:40:18","guid":{"rendered":"https:\/\/www.pythonparatodo.com\/?p=151"},"modified":"2020-06-12T19:46:57","modified_gmt":"2020-06-12T17:46:57","slug":"metodos-magicos","status":"publish","type":"post","link":"https:\/\/www.pythonparatodo.com\/?p=151","title":{"rendered":"M\u00e9todos m\u00e1gicos"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Dentro de cualquier clase Python existen unos m\u00e9todos especiales que se pueden ver con el interprete interactivo de Python, usando la siguiente sintaxis:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>dir(nombre_clase)<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Se les llama m\u00e9todos m\u00e1gicos porque puedes usarlos para crear magia en tus clases. Los nombres de estos m\u00e9todos est\u00e1n rodeados de dos s\u00edmbolos de guion bajo de la siguiente forma:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>__nombrem\u00e9todom\u00e1gico__<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para ver un ejemplo se puede abrir el interprete interactivo y escribir una clase sencilla:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">>>> class Juego:\n...     def juega():\n...             print('Buena jugada')<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ahora miramos los m\u00e9todos.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">>>> dir(Juego)\n['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__','juega']<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Hay m\u00e9todos m\u00e1gicos que est\u00e1n destinados a ayudar en la construcci\u00f3n o destrucci\u00f3n de la clase u objeto.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>__new__(cls , \u2026)<\/strong>: Es el primer m\u00e9todo que se inicia cuando se instancia un objeto. Su primer argumento es el nombre de la clase.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>__init__(self , \u2026)<\/strong>: Es el constructor del objeto. Su primer argumento es el nombre del objeto.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>__del__(self)<\/strong>: Es el m\u00e9todo destructor del objeto donde se pueden incluir cierres de archivos o conexiones. Si no se declara nada, se puede usar como objeto.__del__() para finalizar la instancia.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Otros sirven para modificar el comportamiento del objeto.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>__repr__(self)<\/strong>: Define el comportamiento cuando se obtiene informaci\u00f3n del objeto, por ejemplo, escribiendolo directamente en el interprete de python.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>__str__(self)<\/strong>: Define el comportamiento cuando a un objeto se le asigna el valor de la funci\u00f3n str(objeto). La funci\u00f3n print(nombr_objeto) devolver\u00eda el valor retornado en este m\u00e9todo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Estos son los datos que devuelven estos m\u00e9todos m\u00e1gicos:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">>>> class Juego:\n...     pass\n... \n>>> mijuego = Juego()\n>>> mijuego\n&lt;__main__.Juego object at 0x1016c0b90>\n>>> print(mijuego)\n&lt;__main__.Juego object at 0x1016c0b90><\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Tras la modificaci\u00f3n de los mismos:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">>>> class Juego:\n...     def __repr__(self):\n...             return 'Clase Juego'\n...     def __str__(self):\n...             return 'Juego'\n... \n>>> mijuego = Juego()\n>>> mijuego\nClase Juego\n>>> print(mijuego)\nJuego<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Si se usa una clase u objeto con<strong> if<\/strong> o <strong>while<\/strong>, el valor que retorna siempre es True salvo que se use el m\u00e9todo <strong>__bool__()<\/strong> para devolver False o que el m\u00e9todo <strong>__len__()<\/strong> devuelva cero. Un ejemplo de esto ser\u00eda:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">>>> class Persona:\n...     def __init__(self,manos):\n...             self.manos = 2\n... \n>>> yo = Persona(2)\n>>> if yo:\n...     print('yo es True')\n... \nyo es True<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">O tambi\u00e9n.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">>>> class Persona():\n...     def __init__(self,manos):\n...             self.manos = 2\n...     def __bool__(self):\n...             return False\n... \n>>> yo = Persona(2)\n>>> if yo:\n...     print('yo es True')\n... else:\n...     print('yo es False')\n... \nyo es False<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Puedes leer mas acerca de los m\u00e9todos m\u00e1gicos en <strong>A guide to Python\u2019s Magic Methods<\/strong> escrito por <strong>Rafe Kettler<\/strong> disponible la siguiente web: <a href=\"https:\/\/rszalski.github.io\/magicmethods\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/rszalski.github.io\/magicmethods\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dentro de cualquier clase Python existen unos m\u00e9todos especiales que se pueden ver con el interprete interactivo de Python, usando &hellip; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[65,6],"class_list":["post-151","post","type-post","status-publish","format-standard","hentry","category-python","tag-metodos-magicos","tag-python3"],"_links":{"self":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts\/151","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=151"}],"version-history":[{"count":3,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts\/151\/revisions"}],"predecessor-version":[{"id":154,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts\/151\/revisions\/154"}],"wp:attachment":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=151"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=151"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=151"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}