لماذا يستخدم Python اثنين من السدود لبعض الأشياء؟

StackOverflow https://stackoverflow.com/questions/3443043

  •  27-09-2019
  •  | 
  •  

سؤال

أنا جديد إلى حد ما على لغات البرمجة الفعلية ، وبيثون هو أول لعبة لي. أعرف طريقي حول Linux قليلاً ، وهو ما يكفي للحصول على وظيفة صيفية معها (ما زلت في المدرسة الثانوية) ، وفي الوظيفة ، لدي الكثير من وقت الفراغ الذي أستخدمه لتعلم Python.

شيء واحد كان يحصل علي رغم ذلك. ما يختلف بالضبط في بيثون عندما يكون لديك تعبيرات مثل

x.__add__(y) <==> x+y
x.__getattribute__('foo') <==> x.foo

أعرف ما هي الأساليب والأشياء ، وأحصل على ما يفعلونه ، لكن سؤالي هو: كيف تكون تلك الأساليب السفلية المزدوجة أعلاه تختلف عن معادلاتها الأكثر بساطة؟

ملاحظة ، لا أمانع في محاضرة في تاريخ البرمجة ، في الواقع ، أجد أنه من المفيد جدًا معرفة :) إذا كانت هذه الجوانب التاريخية من Python ، فلا تتردد في البدء.

هل كانت مفيدة؟

المحلول

حسنًا ، قوة المبرمج جيدة ، لذلك يجب أن تكون هناك طريقة لتخصيص السلوك. مثل الحمل الزائد للمشغل (__add__, __div__, __ge__, ، ...) ، وصول السمة (__getattribute__, __getattr__ (هذان مختلفان) ، __delattr__, ، ...) وما إلى ذلك ، في كثير من الحالات ، مثل المشغلين ، خرائط بناء الجملة المعتادة 1: 1 إلى الطريقة المعنية. في حالات أخرى ، هناك إجراء خاص يتضمن في مرحلة ما استدعاء الطريقة المعنية - على سبيل المثال ، __getattr__ لا يسمى إلا إذا لم يكن للكائن السمة المطلوبة و __getattribute__ لم يتم تنفيذه أو رفعه. وبعضها مواضيع متقدمة حقًا تجعلك دييب في أحشاء نظام الكائنات ونادراً ما تكون هناك حاجة إليها. لذلك لا حاجة لتعلمهم جميعًا ، فقط استشر المرجع عندما تحتاج/تريد معرفته. الحديث عن المرجع ، ها هو.

نصائح أخرى

هنا منشئ بيثون شرح ذلك:

... بدلاً من وضع بناء جملة جديد لأنواع خاصة من أساليب الفصل (مثل المهيمنات والمدمرين) ، قررت أن هذه الميزات يمكن معالجتها ببساطة من خلال مطالبة المستخدم بتنفيذ أساليب بأسماء خاصة مثل __init__, __del__, ، وهكذا دواليك. تم أخذ اتفاقية التسمية هذه من C حيث يتم حجز المعرفات التي تبدأ من السطح السفلي من قبل المترجم وغالبًا ما يكون لها معنى خاص (على سبيل المثال ، وحدات الماكرو مثل __FILE__ في المعالج المسبق C).

...

لقد استخدمت أيضًا هذه التقنية للسماح لفئات المستخدمين بإعادة تعريف سلوك مشغلي Python. كما لوحظ سابقًا ، يتم تنفيذ Python في C ويستخدم جداول مؤشرات الوظائف لتنفيذ قدرات مختلفة من الكائنات المدمجة (على سبيل المثال ، "Get Attribute" و "Add" و "Call"). للسماح بتحديد هذه القدرات في الفئات المعرفة من قبل المستخدم ، قمت بتعيين مؤشرات الوظائف المختلفة لأسماء الطرق الخاصة مثل __getattr__, __add__, ، و __call__. هناك مراسلات مباشرة بين هذه الأسماء وجداول مؤشرات الوظيفة التي يتعين على المرء تحديدها عند تنفيذ كائنات Python جديدة في C.

عندما تبدأ طريقة مع اثنين من السطح (وليس هناك السطح السفلي) ، Python's اسم mangling يتم تطبيق القواعد. هذه طريقة لمحاكاة فضفاضة private الكلمة الرئيسية من لغات OO الأخرى مثل C ++ و Java. (على الرغم من ذلك ، لا تزال الطريقة غير خاصة تقنيًا بالطريقة التي تكون بها طرق Java و C ++ خاصة ، ولكن من الصعب الحصول على "من خارج المثيل.)

تعتبر الأساليب التي تحتوي على اثنين من الرائدين واثنين من السطح المتخلف عن طرق "مدمجة" ، أي أنها تستخدم من قبل المترجم المترجم وهي عمومًا التطبيقات الملموسة للمشغلين المحملين الزائد أو غيرها من الوظائف المدمجة.

يتم استخدامها لتحديد أن مترجم Python يجب أن يستخدمها في مواقف محددة.

على سبيل المثال __add__ وظيفة تسمح + المشغل للعمل في فصول مخصصة. وإلا ستحصل على نوع من الخطأ غير المحدد عند محاولة إضافة.

من منظور تاريخي ، غالبًا ما يتم استخدام العوامل السفلية الرائدة كوسيلة للإشارة إلى المبرمج إلى أن الأسماء يجب اعتبارها داخلية للحزمة/الوحدة/المكتبة التي تحددها. في اللغات التي لا توفر دعمًا جيدًا لمساحات الأسماء الخاصة ، يعد استخدام Underscores اتفاقية لمحاكاة ذلك. في Python ، عندما تحدد طريقة تسمى "__foo__" ، يعرف مبرمج الصيانة من الاسم الذي يحدث شيء مميز لا يحدث بطريقة تسمى "Foo". إذا اختار Python استخدام "إضافة" كطريقة داخلية لإفراط "+" ، فلن تتمكن أبدًا من الحصول على فئة ذات طريقة "إضافة" دون التسبب في الكثير من الارتباك. تعمل السطح كإشارة إلى أن بعض السحر سيحدث.

يتم الآن تمييز عدد من الأسئلة الأخرى على أنها تكرارات لهذا السؤال ، واثنان منهم على الأقل يسألون ما __spam__ يتم استدعاء الطرق ، أو ما تسمى الاتفاقية ، ولا يغطي أي من الإجابات الحالية ذلك ، لذلك:

في الواقع لا يوجد اسم رسمي لأي منهما.

العديد من المطورين يسمونهم بشكل غير رسمي "أساليب dunder" ، لـ "Double Swentscore".

يستخدم بعض الأشخاص مصطلح "الأساليب السحرية" ، لكن هذا غامض إلى حد ما بين أساليب المعنى ، والطرق الخاصة (انظر أدناه) ، أو شيء ما بين الاثنين.


هناك هو المصطلح الرسمي "السمات الخاصة" ، والتي تتداخل عن كثب ولكن ليس تماما مع أساليب dunder. ال نموذج البيانات لا يشرح الفصل في المرجع أبدًا ماهية السمة الخاصة ، لكن الفكرة الأساسية هي أنه على الأقل واحد مما يلي:

  • سمة يقدمها المترجم المترجم نفسه أو رمزه المبني ، مثل __name__ على وظيفة.
  • سمة جزء من بروتوكول ينفذه المترجم نفسه ، مثل __add__ ل + المشغل ، أو __getitem__ لفهرسة وتقطيع.
  • سمة يُسمح للمترجم المترجم بالبحث بشكل خاص ، من خلال تجاهل المثيل والذهاب إلى الفصل ، مثل __add__ تكرارا.

معظم السمات الخاصة هي الأساليب ، ولكن ليس كل شيء (على سبيل المثال ، __name__ ليس). ومعظمهم يستخدمون اتفاقية "dunder" ، ولكن ليس كل شيء (على سبيل المثال ، next طريقة على التكرار في بيثون 2.x).

وفي الوقت نفسه ، فإن معظم أساليب Dunder هي سمات خاصة ، ولكن ليس كلها - على وجه الخصوص ، ليس من غير المألوف للمكتبات stdlib أو الخارجية أن ترغب في تحديد بروتوكولاتها الخاصة التي تعمل بنفس الطريقة ، مثل pickle بروتوكول.

المضاربة تأثر بيثون Algol68, Guido ربما تستخدم algol68 في جامعة أمستردام حيث Algol68 لديه مشابه "نظام التورط"يسمى" اقتباس stropping ". في Algol68 المشغلين والأنواع والكلمات الرئيسية تستطيع تظهر في محرف مختلف (عادة **بالخط العريض**، أو __Urnuned__) ، في ملفات sourcecode يتم تحقيق هذا الطراز مع عروض الأسعار ، على سبيل المثال "ABS" (نقلاً عن اقتباس في "wikitext')

Algol68 ⇒ Python (تم تعيين المشغلين إلى وظائف الأعضاء)

  • 'و' __and__
  • أو '⇒ __or__
  • "لا" لا
  • 'Entier' ⇒ __trunc__
  • 'shl' ⇒ __lshift__
  • 'Shr' ⇒ __rshift__
  • 'upb' ⇒ __sizeof__
  • 'long' ⇒ __long__
  • 'int' ⇒ __int__
  • 'حقيقي' ⇒ __float__
  • 'Format' ⇒ __format__
  • 'reper' ⇒ __repr__
  • 'abs' ⇒ __abs__
  • 'ناقص' ⇒ __neg__
  • 'ناقص' ⇒ __sub__
  • "زائد" ⇒ __add__
  • 'الأوقات' ⇒ __mul__
  • 'mod' ⇒ __mod__
  • 'div' ⇒ __truediv__
  • 'Over' ⇒ __div__
  • 'Up' ⇒ __pow__
  • "أنا"
  • 're ⇒ حقيقي
  • 'conj' ⇒ مترافق

في Algol68 تمت الإشارة إليها على أنها أسماء جريئة, ، على سبيل المثال عضلات المعدة, ، ولكن "تحت الأفران" __abs__ في بيثون.

بلدي 2 سنت: ¢ في بعض الأحيان - مثل شبح - عندما تقطع ولصق دروس بيثون في ويكي سوف تجسد بطريقة سحرية algol68 بالخط العريض الكلمات الدالة. ¢

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top