البرمجة

حل مشكلة استدعاء الدوال في Python: تصحيح أخطاء TypeError

في البداية، يبدو أن هناك خطأ في طريقة استدعاء الدالة __init__ في كلاس Game_Events في الكود الذي قدمته. لكن قبل أن نتناول هذا الخطأ، دعنا نتناول فهم أعمق حول كيفية عمل الأشياء في Python.

عند إنشاء كائن من فئة في Python، يتم تلقائياً استدعاء الدالة __init__ لتهيئة الكائن. وفي هذه الحالة، يجب أن تتوقع دالة __init__ اثنين من المعاملات (بالإضافة إلى self الذي يشير إلى الكائن نفسه).

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

لحل هذا، يمكنك تعديل الكود كالتالي:

python
class Game_Events(object): def __init__(self, DoSetup): if DoSetup == "yes": print("Done") # إنشاء كائن من الفئة Game_Events وتمرير المعامل الأول الذي يشير إلى الكائن نفسه GE = Game_Events("no")

بهذا التعديل، يتم تمرير المعامل الأول (self) تلقائياً عند إنشاء كائن من الفئة، ولن تحدث أي مشكلة.

على الجانب الآخر، إذا كنت ترغب في استدعاء الدالة __init__ بشكل صريح، يمكنك فعل ذلك على النحو التالي:

python
class Game_Events(object): def __init__(self, DoSetup): if DoSetup == "yes": print("Done") # إنشاء كائن من الفئة Game_Events GE = Game_Events.__new__(Game_Events) # استدعاء الدالة __init__ بشكل صريح وتمرير المعامل الأول الذي يشير إلى الكائن نفسه Game_Events.__init__(GE, "no")

ومع ذلك، يفضل في معظم الحالات استخدام الطريقة الأولى حيث يتم تمرير المعامل الأول (self) تلقائياً عند إنشاء الكائن.

المزيد من المعلومات

بالطبع، دعونا نقوم بفحص المزيد من التفاصيل في الكود ونقدم بعض التوجيهات الإضافية لتحسين فهم الأمور.

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

تستخدم __init__ لتلقي معاملات، حيث تتوقع معاملًا يُمثل الكائن نفسه (self) بالإضافة إلى معاملات أخرى. في حالتنا، يُمثل DoSetup المعامل الوحيد الذي تتوقعه الدالة.

في الكود الذي قدمته، قمت بإنشاء كائن GE من الفئة Game_Events دون تمرير معاملات. في المثال المعدل، قمت بتصحيح هذا الأمر عن طريق تمرير قيمة “no” لـ DoSetup أثناء إنشاء الكائن.

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

python
class Game_Events(object): def __init__(self, DoSetup="yes"): if DoSetup == "yes": print("Done") # يمكنك إنشاء الكائن بدون تمرير أي معاملات لاستخدام القيمة الافتراضية "yes" GE = Game_Events()

هذا يسمح لك بتوفير قيم افتراضية للمعاملات، وإذا قررت توفير قيمة، فستستخدم القيمة التي قدمتها.

مقالات ذات صلة

زر الذهاب إلى الأعلى
إغلاق

أنت تستخدم إضافة Adblock

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