قد لا يكون التحميل الزائد للوظائف مدمجًا في بايثون، ولكن هناك طرقًا لتقليده.

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

تتيح لك هذه التقنية إجراء عمليات مختلفة بناءً على نوع وعدد الوسائط التي تم تمريرها إلى الوظيفة.

على عكس لغات مثل C++ وJava، لا تدعم Python التحميل الزائد للوظائف بشكل افتراضي، ولكن هناك طرق لتحقيق وظائف مماثلة.

كيف تتعامل بايثون مع التحميل الزائد للوظائف؟

في Python، يمكنك تعريف نفس الوظيفة أكثر من مرة باستخدام معلمات أو أنواع بيانات مختلفة أو كليهما في كل تعريف. ومع ذلك، ستتعرف بايثون فقط على التعريف الأخير للدالة عند استدعائها. هنا مثال:

defarithmetics(a, b):
return a - b

defarithmetics(a, b, c, d):
return a + b - c * d

print(arithmetics(1, 2, 3, 5)) # returns -12
print(arithmetics(1, 2)) # returns missing positional arguments error

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

في الكود أعلاه، ستتعرف بايثون فقط على التعريف الثاني لـ

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

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

لذلك، لا تتعامل بايثون مع التحميل الزائد للوظائف بشكل افتراضي، ولكن هناك بعض الحيل التي يمكنك استخدامها لمحاكاة سلوكها في برامجك.

الطريقة الأولى: استخدام المعلمات الاختيارية أو الوسائط الافتراضية

يمكنك تحقيق التحميل الزائد عن طريق تحديد دالة باستخدام الوسائط الافتراضية. هنا مثال:

defarithmetics(a, b=0, c=0):

Arguments:
a: The first number.
b: The second number (optional).
c: The third number (optional).

return a - b + c

تحتوي هذه الدالة على ثلاث معلمات، لكن اثنتان منها لهما قيم افتراضية. هذا يعني أنه يمكنك استدعاؤه باستخدام وسيطة واحدة وثلاث وسيطات:

print(arithmetics(1)) # returns 1
print(arithmetics(2, 5)) # returns -3
print(arithmetics(10, 3, 4)) # returns 11

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

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

الطريقة الثانية: استخدام الوسائط المتغيرة

لاستخدام الوسائط المتغيرة للتحميل الزائد للوظائف في بايثون، يجب عليك ذلك قم بتضمين المعلمة args عند تحديد وظيفتك. ال الحجج تسمح لك المعلمة بتمرير وسائط موضعية متعددة عند استدعاء وظيفتك. هنا مثال:

defarithmetics(a, *args):

Arguments:
a: The first number.
*args: A variable number of arguments (optional).

args_sum = 0

for num in args:
args_sum *= num

return a - args_sum

print(arithmetics(1)) # returns 1
print(arithmetics(2, 5)) # returns 2
print(arithmetics(10, 3, 4, 2, 4, 6)) # returns 10

تأخذ الوظيفة أعلاه وسيطتين: وسيطة إلزامية تسمى أ و ال الحجج الوسيطة، والتي تسمح لك بإدخال أي عدد تريده من الوسائط.

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

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

الطريقة الثالثة: استخدام ديكور الإرسال المتعدد

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

لاستخدام مصمم الإرسال المتعدد، اتبع الخطوات التالية:

  1. ثَبَّتَ multidispath في بيئة بايثون الخاصة بك:
    pip install multipledispatch
  2. قم بتزيين وظيفتك (وظائفك) بـ @إرسال مصمم ديكور. ال @إرسال مصمم الديكور هو أ مصمم بايثون الذي يسمح لك بتنفيذ إرسال متعدد. سيتم إرسال الوظيفة المناسبة تلقائيًا بناءً على الوسائط التي تمررها إليها. يمكنك استخدام ال @إرسال مصمم الديكور باتباع هذا النمط:
    from multipledispatch import dispatch

    @dispatch(data type1, data type2, data typeX)
    defyour_function(a, b, c, x):
    pass
    # perform your operations here

فيما يلي مثال يستخدم مصمم الإرسال المتعدد للتحميل الزائد للوظائف في بايثون:

from multipledispatch import dispatch

@dispatch(int, int)
defadd(a, b):

Arguments:
a: Any integer.
b: Any integer.

return a + b

@dispatch(int, list)
defadd(a, b):

Arguments:
a: Any integer.
b: Any Python list.

b.append(a)
return b

# returns 3
print(add(1, 2))

# returns [2, 3, 4, 5, 'w', 'done', 1]
print(add(1, [2, 3, 4, 5, 'w', 'done']))

يحدد مقتطف الكود أعلاه حالتين من يضيف() وظيفة. يأخذ المثيل الأول عددين صحيحين كوسيطتين ويعيد مجموعهما.

وفي الوقت نفسه، يأخذ الإصدار الثاني من هذه الوظيفة عددًا صحيحًا وقائمة. يقوم بإلحاق العدد الصحيح بالقائمة وإرجاع القائمة الجديدة.

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

أفضل نهج تجاه التحميل الزائد للوظائف في بايثون

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

يوفر هذا الديكور طريقة نظيفة ومرنة لتنفيذ التحميل الزائد للوظائف في بايثون. يتيح لك تحديد تطبيقات متعددة لوظيفة واحدة بناءً على نوع الوسائط الخاصة بها.

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