[python] لماذا تقوم بعض الوظائف بتأكيد "__" قبل اسم الدالة وبعده؟


1 Answers

المستجيبون الآخرون صحيحون في وصف الشُرَط السفلية المزدوجة والرائدة كإتفاقية تسمية لأساليب "خاصة" أو "سحرية".

بينما يمكنك استدعاء هذه الطرق مباشرة ( [10, 20].__len__() على سبيل المثال) ، فإن وجود الشُرَط السفلية هو تلميح إلى أن هذه الطرق يُراد بها بشكل غير مباشر ( len([10, 20]) على سبيل المثال) . لدى معظم مشغلي python طريقة "سحرية" مقترنة (على سبيل المثال ، a[x] هي الطريقة المعتادة لاستدعاء a.__getitem__(x) ).

Question

يبدو أن هذا يحدث كثيرًا ، وكان يتساءل ما إذا كان هذا مطلبًا في لغة بايثون ، أم أنه مجرد مسألة اتفاقية؟

أيضا ، هل يمكن لشخص ما أن يشرح ويشرح أي الوظائف تميل إلى امتلاك الشرطات السفلية ، ولماذا ( __init__ ، على سبيل المثال)؟




في الواقع ، استخدم أسماء أسلوب _ عندما أحتاج إلى الاختلاف بين أسماء الفئات الأصل والتابعة. لقد قرأت بعض الرموز التي استخدمت هذه الطريقة في إنشاء دروس الوالدين والطفل. على سبيل المثال ، يمكنني تقديم هذا الرمز:

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))

...

والطفل الذي لديه طريقة _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)
    )

...






Related