في البداية، يبدو أن هناك خطأ في طريقة استدعاء الدالة __init__
في كلاس Game_Events
في الكود الذي قدمته. لكن قبل أن نتناول هذا الخطأ، دعنا نتناول فهم أعمق حول كيفية عمل الأشياء في Python.
عند إنشاء كائن من فئة في Python، يتم تلقائياً استدعاء الدالة __init__
لتهيئة الكائن. وفي هذه الحالة، يجب أن تتوقع دالة __init__
اثنين من المعاملات (بالإضافة إلى self
الذي يشير إلى الكائن نفسه).
الخطأ الذي تحصل عليه يشير إلى أن هناك مشكلة في عدد المعاملات التي يتم تمريرها عند استدعاء الدالة __init__
. في الكود الذي قدمته، تحاول استدعاء الدالة __init__
داخل الكائن Game_Events
بدون تمرير المعامل الأول الذي يشير إلى الكائن نفسه.
لحل هذا، يمكنك تعديل الكود كالتالي:
pythonclass Game_Events(object):
def __init__(self, DoSetup):
if DoSetup == "yes":
print("Done")
# إنشاء كائن من الفئة Game_Events وتمرير المعامل الأول الذي يشير إلى الكائن نفسه
GE = Game_Events("no")
بهذا التعديل، يتم تمرير المعامل الأول (self
) تلقائياً عند إنشاء كائن من الفئة، ولن تحدث أي مشكلة.
على الجانب الآخر، إذا كنت ترغب في استدعاء الدالة __init__
بشكل صريح، يمكنك فعل ذلك على النحو التالي:
pythonclass 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__
. على سبيل المثال:
pythonclass Game_Events(object):
def __init__(self, DoSetup="yes"):
if DoSetup == "yes":
print("Done")
# يمكنك إنشاء الكائن بدون تمرير أي معاملات لاستخدام القيمة الافتراضية "yes"
GE = Game_Events()
هذا يسمح لك بتوفير قيم افتراضية للمعاملات، وإذا قررت توفير قيمة، فستستخدم القيمة التي قدمتها.