فهم أساليب 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__
من العضوية في مكونات المتجه.
خاتمة
تعد الطرق السحرية ووظائف دندر أدوات أساسية لتخصيص وتحسين سلوك فئات بايثون الخاصة بك. من خلال تجاوز هذه الطرق، يمكنك إنشاء كائنات تتكامل بسلاسة مع بناء الجملة والعمليات في بايثون، مما يوفر تجربة برمجة أكثر بديهية وقوة. إن فهم هذه الطرق واستخدامها بفعالية من شأنه أن يحسن بشكل كبير من قدرتك على كتابة كود بايثون مرن وقابل للصيانة.