[Python] ¿Por qué algunas funciones han subrayado "__" antes y después del nombre de la función?


Answers

Los otros encuestados están en lo cierto al describir los guiones bajos iniciales y finales dobles como una convención de nomenclatura para métodos "especiales" o "mágicos".

Si bien puede llamar a estos métodos directamente ( [10, 20].__len__() por ejemplo), la presencia de los caracteres de subrayado es una pista de que estos métodos están destinados a ser invocados indirectamente ( len([10, 20]) por ejemplo) . La mayoría de los operadores de python tienen un método "mágico" asociado (por ejemplo, a[x] es la forma habitual de invocar a.__getitem__(x) ).

Question

Esto parece ocurrir mucho, y me preguntaba si esto era un requisito en el lenguaje Python, o simplemente una cuestión de convención.

Además, ¿podría alguien nombrar y explicar qué funciones tienden a tener los guiones bajos, y por qué ( __init__ , por ejemplo)?




En realidad, uso _ nombres de métodos cuando necesito diferir entre los nombres de las clases padre e hijo. He leído algunos códigos que utilizan esta forma de crear clases para padres e hijos. Como ejemplo, puedo proporcionar este código:

class ThreadableMixin:
   def start_worker(self):
       threading.Thread(target=self.worker).start()

   def worker(self):
      try:
        self._worker()
    except tornado.web.HTTPError, e:
        self.set_status(e.status_code)
    except:
        logging.error("_worker problem", exc_info=True)
        self.set_status(500)
    tornado.ioloop.IOLoop.instance().add_callback(self.async_callback(self.results))

...

y el niño que tiene un método _worker

class Handler(tornado.web.RequestHandler, ThreadableMixin):
   def _worker(self):
      self.res = self.render_string("template.html",
        title = _("Title"),
        data = self.application.db.query("select ... where object_id=%s", self.object_id)
    )

...