طرق السحر في بايثون
تشرح هذه المقالة طرق السحر في بايثون۔
YouTube Video
طرق السحر في بايثون
طرق السحر (الطرق الخاصة) في بايثون هي طرق ذات أسماء خاصة تُستخدم لمنح الأصناف سلوكيات فريدة.۔ على سبيل المثال، تتميز بأنها محاطة بشرطتين سفليتين مزدوجتين (dunders)، مثل __init__
و __str__
.۔ لذلك، يُطلق عليها أيضًا طرق dunder.۔
من خلال تعريف طرق السحر، يمكنك تخصيص السلوك الافتراضي للأصناف.۔ على سبيل المثال، تعريف __add__
يسمح لك بتغيير سلوك عامل الجمع +
.۔
طرق السحر للتهيئة وتمثيل النصوص
__init__
: طريقة التهيئة
طريقة __init__
هي منشئ يتم استدعاؤه تلقائيًا عند إنشاء كائن (مثيل) جديد.۔
1class Person:
2 def __init__(self, name, age):
3 self.name = name
4 self.age = age
5
6person = Person("Alice", 30)
7print(person.name) # Alice
__str__
: تمثيل نصي مقروء للبشر
طريقة __str__
تُرجع تمثيلًا نصيًا مقروءًا للبشر.۔ يتم استدعاؤها من قبل print()
و str()
.۔
1class Person:
2 def __init__(self, name):
3 self.name = name
4
5 def __str__(self):
6 return f"Person: {self.name}"
7
8person = Person("Bob")
9print(person) # Person: Bob
__repr__
: تمثيل نصي موجه للتصحيح
طريقة __repr__
تعيد تمثيلًا نصيًا لأغراض التصحيح.۔ تُستخدم بواسطة repr()
وعند العرض في المفسر.۔
1class Person:
2 def __init__(self, name):
3 self.name = name
4
5 def __repr__(self):
6 return f"Person(name={self.name!r})"
7
8person = Person("Eve")
9print(repr(person)) # Person(name='Eve')
زيادة التحميل لمشغلات العمليات الحسابية
__add__
: عامل الجمع +
من خلال استخدام طرق السحر، يمكن زيادة تحميل مشغلات العمليات الحسابية.۔ على سبيل المثال، طريقة __add__
تتيح زيادة تحميل عامل الجمع +
.۔
1class Vector:
2 def __init__(self, x, y):
3 self.x = x
4 self.y = y
5
6 def __add__(self, other):
7 return Vector(self.x + other.x, self.y + other.y)
8
9 def __repr__(self):
10 return f"Vector({self.x}, {self.y})"
11
12 # Other arithmetic magic methods:
13 # def __sub__(self, other): # Subtraction (-)
14 # def __mul__(self, other): # Multiplication (*)
15 # def __truediv__(self, other): # True division (/)
16 # def __floordiv__(self, other): # Floor division (//)
17 # def __mod__(self, other): # Modulo (%)
18 # def __pow__(self, other): # Exponentiation (**)
19
20v1 = Vector(1, 2)
21v2 = Vector(3, 4)
22print(v1 + v2) # Vector(4, 6)
تشمل طرق السحر الحسابية الأخرى ما يلي:۔
الطريقة | العامل |
---|---|
__add__ |
+ |
__sub__ |
- |
__mul__ |
* |
__truediv__ |
/ |
__floordiv__ |
// |
__mod__ |
% |
__pow__ |
** |
تخصيص مشغلات المقارنة
يمكنك أيضًا زيادة تحميل مشغلات المقارنة.۔ على سبيل المثال، طريقة __eq__
تزيد تحميل عامل المساواة.۔
1class Box:
2 def __init__(self, volume):
3 self.volume = volume
4
5 def __eq__(self, other):
6 return self.volume == other.volume
7
8 def __lt__(self, other):
9 return self.volume < other.volume
10
11 # Comparison magic methods:
12 # def __eq__(self, other): # Equal to (==)
13 # def __ne__(self, other): # Not equal to (!=)
14 # def __lt__(self, other): # Less than (<)
15 # def __le__(self, other): # Less than or equal to (<=)
16 # def __gt__(self, other): # Greater than (>)
17 # def __ge__(self, other): # Greater than or equal to (>=)
18
19b1 = Box(100)
20b2 = Box(200)
21
22print(b1 == b2) # False
23print(b1 < b2) # True
يوجد أيضًا طرق السحر التالية:۔ تحدد هذه الطرق المقارنات مثل المساواة والترتيب بين الكائنات.۔
العامل | طريقة السحر |
---|---|
== |
__eq__ |
!= |
__ne__ |
< |
__lt__ |
<= |
__le__ |
> |
__gt__ |
>= |
__ge__ |
طرق السحر لأنواع الحاويات
يمكنك إنشاء أصناف تتصرف كالقوائم أو القواميس.۔
__len__
: الحصول على عدد العناصر
طريقة __len__
هي طريقة سحرية تُرجع عدد العناصر.۔
1class Basket:
2 def __init__(self, items):
3 self.items = items
4
5 def __len__(self):
6 return len(self.items)
7
8basket = Basket(["apple", "banana"])
9print(len(basket)) # 2
__getitem__
: الوصول بواسطة الفهرس
يتم استدعاء طريقة __getitem__
عند الوصول بواسطة الفهرس.۔
1class Basket:
2 def __init__(self, items):
3 self.items = items
4
5 def __getitem__(self, index):
6 return self.items[index]
7
8basket = Basket(["apple", "banana"])
9print(basket[1]) # banana
__setitem__
و__delitem__
: التعديل والحذف
يتم استدعاء طريقتي __setitem__
و__delitem__
عند التعديل أو الحذف على العناصر.۔
1class Basket:
2 def __init__(self, items):
3 self.items = items
4
5 def __setitem__(self, index, value):
6 self.items[index] = value
7
8 def __delitem__(self, index):
9 del self.items[index]
10
11basket = Basket(["apple", "banana"])
12basket[1] = "grape"
13del basket[0]
14print(basket.items) # ['grape']
طرق السحر للتكرار
لجعل كائن قابلاً للتكرار في حلقة for
، قم بتنفيذ التالي:۔
__iter__
و__next__
1class Counter:
2 def __init__(self, limit):
3 self.limit = limit
4 self.current = 0
5
6 def __iter__(self):
7 return self
8
9 def __next__(self):
10 if self.current >= self.limit:
11 raise StopIteration
12 self.current += 1
13 return self.current
14
15for num in Counter(3):
16 print(num)
17# Output:
18# 1
19# 2
20# 3
إدارة السياق (with
)
بتعريف طريقتي __enter__
و __exit__
يمكنك تنفيذ المعالجة قبل وبعد جملة with
.۔
1class FileOpener:
2 def __init__(self, filename):
3 self.filename = filename
4
5 def __enter__(self):
6 self.file = open(self.filename, 'r')
7 return self.file
8
9 def __exit__(self, exc_type, exc_val, exc_tb):
10 self.file.close()
11
12with FileOpener("example.txt") as f:
13 content = f.read()
14 print(content)
الكائنات القابلة للاستدعاء: __call__
من خلال تعريف طريقة __call__
يمكنك جعل الكائن قابلاً للاستدعاء كالدوال.۔
1class Greeter:
2 def __init__(self, greeting):
3 self.greeting = greeting
4
5 def __call__(self, name):
6 return f"{self.greeting}, {name}!"
7
8hello = Greeter("Hello")
9print(hello("Alice")) # Hello, Alice!
الملخص
طرق السحر في بايثون طريقة قوية لإضافة سلوك طبيعي وبديهي إلى الأصناف.۔ كل طريقة لها هدف واضح، وتنفيذها بشكل صحيح يتيح لك كتابة كود أكثر مرونة وبايثونية.۔
طرق السحر تعمل كواجهة 'خفية' تدعم كيفية تفاعل الكائنات وتصرفها في بايثون خلف الكواليس.۔
يمكنك متابعة المقالة أعلاه باستخدام Visual Studio Code على قناتنا على YouTube.۔ يرجى التحقق من القناة على YouTube أيضًا.۔