11.4 التحميل الزائد للعوامل
أهداف التعلم
في نهاية هذا القسم، ينبغي أن تكون قادرًا على:
- تحديد التوابع السحرية ووصف الغرض منها.
- تطوير العوامل الحسابية وعوامل المقارنة المُحمَّلة زائدًا للأصناف المعرّفة من قبل المستخدم.
التوابع السحرية والتخصيص
التوابع السحرية (Magic methods) توابع خاصة تنفذ إجراءات للمستخدمين، وعادةً ما تكون مخفية عنهم. تُسمى التوابع السحرية أيضًا توابع دَندَر، لأن هذه التوابع تبدأ وتنتهي بشرطتين سفليتين مزدوجتين (__). مثال: __init__() تابع سحري يُستخدم جنبًا إلى جنب مع __new__() لإنشاء مثيل جديد وتهيئة السمات بسطر بسيط مثل eng = Engineer(). يمكن للمبرمج تعريف تابع سحري بشكل صريح في صنف معرّف من قبل المستخدم لتخصيص سلوك التابع.
مفاهيم تطبيقية
التوابع السحرية
التحميل الزائد للعوامل الحسابية
التحميل الزائد للعوامل (Operator overloading) يشير إلى تخصيص وظيفة عامل مُضمَّن. تُحمَّل العوامل الحسابية زائدًا عادةً للسماح بإجراء تغييرات سهلة على مثيلات الأصناف المعرّفة من قبل المستخدم.
| العامل الحسابي (العملية) | التابع السحري |
|---|---|
| + (الجمع) | __add__(self, other) |
| - (الطرح) | __sub__(self, other) |
| * (الضرب) | __mul__(self, other) |
| / (القسمة) | __truediv__(self, other) |
| % (باقي القسمة) | __mod__(self, other) |
| ** (الأس) | __pow__(self, other) |
مفاهيم تطبيقية
التحميل الزائد للعوامل الحسابية
التحميل الزائد لعوامل المقارنة
يمكن أيضًا تحميل عوامل المقارنة زائدًا مثل العوامل الحسابية.
| عامل المقارنة (العملية) | التابع السحري |
|---|---|
| < (أصغر من) | __lt__(self, other) |
| > (أكبر من) | __gt__(self, other) |
| <= (أصغر من أو يساوي) | __le__(self, other) |
| >= (أكبر من أو يساوي) | __ge__(self, other) |
| == (يساوي) | __eq__(self, other) |
| != (لا يساوي) | __ne__(self, other) |
مثال 11.2
التحميل الزائد لعوامل المقارنة للصنف Account
| الشِفرة | المُخرَج |
|---|---|
class Account:
def __init__(self, name="", amount=0):
self.name = name
self.amount = amount
def __str__(self):
return f"{self.name}: ${self.amount}"
def __lt__(self, other):
return self.amount < other.amount
def __gt__(self, other):
return self.amount > other.amount
def __eq__(self, other):
return self.amount == other.amount
acct_a = Account("Ashe", 6492)
acct_b = Account("Bevins", 5210)
print(acct_a < acct_b)
print(acct_a > acct_b)
acct_a.amount = 5210
print(acct_a == acct_b)
|
FalseTrueTrue
|
مفاهيم تطبيقية
التحميل الزائد لعوامل المقارنة
تأمل المثال أعلاه.
جرّب بنفسك
دمج سجلات التمارين
يحتوي الصنف ExerciseLog على سمتين للمثيل: e_type، وهو نوع التمرين، و duration، وهو الوقت المستغرق في التمرين.
حمِّل العامل + زائدًا لدمج سجلين للتمارين (ExerciseLogs) بحيث:
- إذا كانت أنواع التمارين مختلفة، ادمجها بوضع
" and "بينهما. وإلا، استخدم نفس النوع ولا تكرر. - اجمع المدد الزمنية معًا.
المدخلات المعطاة:
walk
5
run
30
المُخرَج هو:
walk and run: 35 minutes
جرّب بنفسك
توسيع الصنف Account
يسمح استخدام isinstance() للمبرمج بتعريف سلوكيات مختلفة اعتمادًا على نوع الكائن. المُعامِل الأول هو الكائن، والمُعامِل الثاني هو النوع أو الصنف. مثال: isinstance(my_var, int) تُرجع True إذا كان my_var عددًا صحيحًا.
وسّع مثال Account الحالي بحيث يمكن استخدام عامل الجمع أيضًا لإضافة قيمة عدد صحيح إلى سمة amount الخاصة بـ Account.