الطرق السحرية في بايثون، والمعروفة أيضًا باسم طرق dunder (لأنها تحتوي على شرطات سفلية مزدوجة في بداية ونهاية أسمائها)، تسمح لنا بتحديد سلوك كائناتنا لمختلف العمليات. إنها تتيح السلوك المخصص ويمكن أن تجعل فصولنا تعمل مثل الأنواع المضمنة. في هذه المدونة، سنستكشف فئات مختلفة من الأساليب السحرية ونقدم شرحًا تفصيليًا ونعطي أمثلة عملية وحالات استخدام.
تتحكم هذه الأساليب السحرية في كيفية الوصول إلى سمات كائناتك أو تعديلها أو حذفها.
__getattr__: يتم الاتصال به عندما لا يتم العثور على سمة في كائن.
__getattribute__: يتم الاتصال به دون قيد أو شرط للوصول إلى أي سمة.
مثال: الوصول إلى السمات المخصصة مع التسجيل
class LoggedAttributes: def __init__(self, name): self.name = name def __getattr__(self, item): print(f"Accessing non-existent attribute: {item}") return None def __getattribute__(self, item): print(f"Getting attribute: {item}") return super().__getattribute__(item) # Usage obj = LoggedAttributes("Alice") print(obj.name) # Output: Getting attribute: name\nAlice print(obj.age) # Output: Accessing non-existent attribute: age\nNone
حالة الاستخدام العملي: تسجيل الوصول إلى السمات في سيناريو تصحيح الأخطاء لتتبع متى وكيف يتم الوصول إلى السمات أو تعديلها.
__setattr__: يتم الاتصال به عند محاولة تعيين السمة.
__delattr__: يتم استدعاؤه عند محاولة حذف السمة.
مثال: تعديل السمة المخصصة مع التحقق من الصحة
class Person: def __init__(self, name, age): self.name = name self.age = age def __setattr__(self, key, value): if key == "age" and valueحالة الاستخدام العملي: فرض قواعد أو قيود التحقق من الصحة عند تعيين السمات أو حذفها.
2. طرق الحاوية
تسمح هذه الأساليب السحرية لكائناتك بالتصرف مثل الحاويات (القوائم، والقواميس، وما إلى ذلك).
__len__، __getitem__، __setitem__، __delitem__، و __iter__
__len__: إرجاع طول الحاوية.
__getitem__: استرداد عنصر في فهرس أو مفتاح معين.
__setitem__: تعيين عنصر في فهرس أو مفتاح معين.
__delitem__: حذف عنصر في فهرس أو مفتاح معين.
__iter__: إرجاع كائن مكرر.
مثال: كائن يشبه القائمة المخصصة
class CustomList: def __init__(self): self._items = [] def __len__(self): return len(self._items) def __getitem__(self, index): return self._items[index] def __setitem__(self, index, value): self._items[index] = value def __delitem__(self, index): del self._items[index] def __iter__(self): return iter(self._items) def append(self, item): self._items.append(item) # Usage cl = CustomList() cl.append(1) cl.append(2) cl.append(3) print(len(cl)) # Output: 3 print(cl[1]) # Output: 2 for item in cl: print(item) # Output: 1 2 3
حالة الاستخدام العملي: إنشاء فئة مجموعة مخصصة تحتاج إلى سلوك متخصص أو طرق إضافية مع الاستمرار في دعم عمليات القائمة القياسية.
تحدد هذه الأساليب كيفية تفاعل كائنات صفك مع العمليات الرقمية والمقارنات.
مثال: فئة الأرقام المركبة المخصصة
class Complex: def __init__(self, real, imag): self.real = real self.imag = imag def __add__(self, other): return Complex(self.real other.real, self.imag other.imag) def __sub__(self, other): return Complex(self.real - other.real, self.imag - other.imag) def __repr__(self): return f"({self.real} {self.imag}i)" # Usage c1 = Complex(1, 2) c2 = Complex(3, 4) print(c1 c2) # Output: (4 6i) print(c1 - c2) # Output: (-2 -2i)
حالة الاستخدام العملي: تنفيذ أنواع رقمية مخصصة مثل الأعداد المركبة أو المتجهات أو المصفوفات.
مثال: تنفيذ الطلب الإجمالي لفئة مخصصة
from functools import total_ordering @total_ordering class Book: def __init__(self, title, author): self.title = title self.author = author def __eq__(self, other): return (self.title, self.author) == (other.title, other.author) def __lt__(self, other): return (self.title, self.author)حالة الاستخدام العملي: تمكين فرز الكائنات المخصصة أو مقارنتها، وهو مفيد في هياكل البيانات مثل أكوام البيانات، أو أشجار البحث الثنائية، أو ببساطة عند فرز قوائم الكائنات المخصصة.
4. طرق الحاوية: حالة الاستخدام العملي
قاموس مخصص بمفاتيح غير حساسة لحالة الأحرف
إنشاء كائن يشبه القاموس يعامل المفاتيح على أنها غير حساسة لحالة الأحرف.
مثال: قاموس حساس لحالة الأحرف
class CaseInsensitiveDict: def __init__(self): self._data = {} def __getitem__(self, key): return self._data[key.lower()] def __setitem__(self, key, value): self._data[key.lower()] = value def __delitem__(self, key): del self._data[key.lower()] def __contains__(self, key): return key.lower() in self._data def keys(self): return self._data.keys() def items(self): return self._data.items() def values(self): return self._data.values() # Usage cid = CaseInsensitiveDict() cid["Name"] = "Alice" print(cid["name"]) # Output: Alice print("NAME" in cid) # Output: Trueحالة الاستخدام العملي: إنشاء قواميس حيث يجب التعامل مع المفاتيح على أنها غير حساسة لحالة الأحرف، ومفيدة للتعامل مع مدخلات المستخدم، وإعدادات التكوين، وما إلى ذلك.
خاتمة
توفر الأساليب السحرية طريقة قوية لتخصيص سلوك الكائنات الخاصة بك في بايثون. إن فهم هذه الأساليب واستخدامها بفعالية يمكن أن يجعل فصولك الدراسية أكثر سهولة وتتكامل بسلاسة مع وظائف وعوامل تشغيل Python المضمنة. سواء كنت تقوم بتنفيذ أنواع رقمية مخصصة، أو حاويات، أو أنماط الوصول إلى السمات، يمكن للطرق السحرية أن تعزز بشكل كبير مرونة ووظائف التعليمات البرمجية الخاصة بك
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3