فهم أساليب Magic ووظائف Dunder في Python

في بايثون، تُعَد الطرق السحرية، والتي يُشار إليها غالبًا باسم طرق dunder (اختصارًا لـ double underscore)، طرقًا خاصة تبدأ وتنتهي بعلامتي سفليتين مزدوجتين. تتيح لك هذه الطرق تحديد كيفية تصرف كائنات فئتك باستخدام العمليات والوظائف المضمنة. وهي جزء لا يتجزأ من البرمجة الموجهة للكائنات في بايثون ويمكنها تحسين وظائف ومرونة فئاتك بشكل كبير.

ما هي الطرق السحرية؟

الأساليب السحرية هي أساليب محددة مسبقًا في بايثون يمكنك تجاوزها لتخصيص سلوك الكائنات الخاصة بك. لا يُقصد استدعاؤها بشكل مباشر ولكن يتم استدعاؤها بواسطة العمليات المضمنة في بايثون. على سبيل المثال، __init__ هي طريقة سحرية تستخدم لتهيئة الكائنات الجديدة، بينما __str__ تحدد التمثيل النصي للكائن.

أساليب السحر الشائعة الاستخدام

  • __init__: يقوم بتهيئة كائن جديد.
  • __str__: يحدد التمثيل النصي لكائن.
  • __repr__: يحدد تمثيلًا رسميًا لسلسلة من الكائنات يمكن استخدامه بشكل مثالي لإعادة إنشاء الكائن.
  • __add__: يحدد سلوك عامل الإضافة.
  • __eq__: يحدد مقارنة المساواة.
  • __len__: إرجاع طول الكائن.
  • __getitem__: يسمح بالفهرسة داخل الكائن.
  • __setitem__: يسمح بتعيين عنصر عند فهرس معين.

مثال: تنفيذ الأساليب السحرية

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

مثال: فئة المتجهات مع الأساليب السحرية

class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __str__(self):
        return f"Vector({self.x}, {self.y})"

    def __repr__(self):
        return f"Vector({self.x}, {self.y})"

    def __add__(self, other):
        return Vector(self.x + other.x, self.y + other.y)

    def __eq__(self, other):
        return self.x == other.x and self.y == other.y

    def __len__(self):
        return 2  # A vector has two components

# Creating instances of Vector
v1 = Vector(2, 3)
v2 = Vector(4, 5)

# Using magic methods
print(v1)               # Output: Vector(2, 3)
print(repr(v2))         # Output: Vector(4, 5)
print(v1 + v2)          # Output: Vector(6, 8)
print(v1 == v2)         # Output: False
print(len(v1))          # Output: 2

في هذا المثال، نقوم بتعريف الطرق السحرية __init__ و__str__ و__repr__ و__add__ و__eq__ و__len__ للتعامل مع العمليات والتمثيلات المختلفة لفئة Vector.

أساليب السحر المتقدمة

بالإضافة إلى الأساليب السحرية المستخدمة بشكل شائع، هناك العديد من الأساليب الأخرى التي تتعامل مع السلوكيات الأكثر تخصصًا:

  • __call__: يسمح باستدعاء الكائن كدالة.
  • __contains__: يتحقق مما إذا كان العنصر موجودًا في حاوية.
  • __enter__ و__exit__: يستخدم في مديري السياق للتعامل مع عمليات الإعداد والإزالة.

مثال: استخدام __call__ و __contains__

class CallableVector:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __call__(self, scale):
        return Vector(self.x * scale, self.y * scale)

    def __contains__(self, value):
        return value in (self.x, self.y)

# Creating an instance of CallableVector
cv = CallableVector(2, 3)

# Using __call__
scaled_vector = cv(10)
print(scaled_vector)  # Output: Vector(20, 30)

# Using __contains__
print(2 in cv)        # Output: True
print(5 in cv)        # Output: False

في هذا المثال، تسمح طريقة __call__ باستدعاء مثيلات CallableVector مثل الدالة، بينما تتحقق طريقة __contains__ من العضوية في مكونات المتجه.

خاتمة

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