طرق السحر في بايثون

طرق السحر في بايثون

تشرح هذه المقالة طرق السحر في بايثون۔

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 أيضًا.۔

YouTube Video