الفئات المجردة في بايثون

الفئات المجردة في بايثون

تشرح هذه المقالة الفئات المجردة في بايثون۔

سنشرح الآلية الأساسية للفئات المجردة باستخدام وحدة abc، وسنقدم أمثلة عملية ونصف كل شيء مع الكود المرافق.۔

YouTube Video

الفئات المجردة في بايثون

تعد وحدة abc في بايثون (الفئات الأساسية المجردة) جزءًا من المكتبة القياسية وتستخدم لتحديد الفئات المجردة وتوفير قالب للأساليب التي يجب أن تقوم بتنفيذها الفئة.۔ استخدام هذه الوحدة يعزز المرونة والقوة في تصميم الفئات.۔

ما هي الفئة المجردة؟

الفئات المجردة هي فئات تُستخدم لتحديد واجهة مشتركة للفئات الملموسة (القابلة للتهيئة).۔ لا يمكن تهيئة الفئات المجردة بحد ذاتها؛ يجب توفير تنفيذ ملموس في الفئات المشتقة (الفرعية).۔

تتيح وحدة abc تعريف الأساليب أو الخصائص المجردة وتفرض تنفيذها في الفئات الوريثة.۔ إذا لم يتم تنفيذ ولو أسلوب مجرد واحد، لا يمكن تهيئة الفئة.۔

كيفية استخدام وحدة abc

لإنشاء فئة مجردة باستخدام وحدة abc، يجب الوراثة من فئة ABC وتعريف الأساليب المجردة باستخدام المزين @abstractmethod

 1from abc import ABC, abstractmethod
 2
 3# Definition of the abstract base class
 4class Animal(ABC):
 5
 6    @abstractmethod
 7    def sound(self):
 8        pass
 9
10# Concrete implementation in the subclass
11class Dog(Animal):
12    def sound(self):
13        return "Woof!"
14
15class Cat(Animal):
16    def sound(self):
17        return "Meow!"

هنا، تم تعريف فئة Animal كفئة مجردة وتحتوي على أسلوب مجرد يسمى sound.۔ يجب أن يتم تنفيذ هذا الأسلوب بشكل ملموس في الفئات الفرعية.۔ ترث كل من Dog و Cat من Animal وكل منهما ينفذ أسلوب sound

تهيئة الفئات المجردة

لا يمكن تهيئة الفئات المجردة مباشرة.۔ على سبيل المثال، محاولة تهيئة فئة Animal نفسها ستؤدي إلى ظهور خطأ.۔

1animal = Animal()  # TypeError: Can't instantiate abstract class Animal with abstract methods sound
  • عند محاولة تهيئة فئة مجردة، يحدد بايثون وجود أساليب مجردة غير مُنفّذة ويرفع استثناء TypeError.۔ إذا تم تنفيذ جميع الأساليب المجردة المطلوبة في الفئة الفرعية، يصبح التهيئة ممكنة.۔

أساليب مجردة متعددة

من الممكن أيضًا أن تحتوي الفئة على العديد من الأساليب المجردة.۔ ما لم يتم تنفيذ جميع الأساليب المجردة في الفئة الفرعية، تظل الفئة فئة مجردة.۔

 1from abc import ABC, abstractmethod
 2
 3class Vehicle(ABC):
 4
 5    @abstractmethod
 6    def start_engine(self):
 7        pass
 8
 9    @abstractmethod
10    def stop_engine(self):
11        pass
12
13class Car(Vehicle):
14    def start_engine(self):
15        return "Car engine started"
16
17    def stop_engine(self):
18        return "Car engine stopped"

في هذا المثال، تحتوي الفئة Vehicle على طريقتين تجريديتين، ولا يمكن إنشاء مثيل لفئة Car إلا بعد تنفيذ كلتا الطريقتين.۔

تعريف الخصائص التجريدية

يدعم الوحدة النمطية abc ليس فقط الطرق التجريدية ولكن أيضًا الخصائص التجريدية.۔ يتيح ذلك فرض تنفيذ الخصائص في الفئات المشتقة.۔

 1from abc import ABC, abstractmethod
 2
 3class Shape(ABC):
 4
 5    @property
 6    @abstractmethod
 7    def area(self):
 8        pass
 9
10class Circle(Shape):
11    def __init__(self, radius):
12        self.radius = radius
13
14    @property
15    def area(self):
16        return 3.14159 * (self.radius ** 2)
  • في هذا المثال، تحتوي الفئة Shape على خاصية تجريدية تدعى area، وتقوم الفئة الفرعية Circle بتنفيذ هذه الخاصية.۔ بهذه الطريقة، يساعد استخدام الفئات التجريدية لفرض تنفيذ الخصائص في الحفاظ على تناسق الشيفرة.۔

استخدام isinstance() و issubclass()

باستخدام الفئات التجريدية، يمكنك تأكيد علاقات وراثة الفئات باستخدام isinstance() أو issubclass()، مما يحسن أمان الشيفرة ومرونتها.۔

 1from abc import ABC, abstractmethod
 2
 3# Definition of the abstract base class
 4class Animal(ABC):
 5
 6    @abstractmethod
 7    def sound(self):
 8        pass
 9
10# Concrete implementation in the subclass
11class Dog(Animal):
12    def sound(self):
13        return "Woof!"
14
15class Cat(Animal):
16    def sound(self):
17        return "Meow!"
18
19class Vehicle(ABC):
20
21    @abstractmethod
22    def start_engine(self):
23        pass
24
25    @abstractmethod
26    def stop_engine(self):
27        pass
28
29class Car(Vehicle):
30    def start_engine(self):
31        return "Car engine started"
32
33    def stop_engine(self):
34        return "Car engine stopped"
35
36print("Dog() is an Animal? -> ", isinstance(Dog(), Animal))   # True
37print("Dog is subclass of Animal? -> ", issubclass(Dog, Animal))  # True
38print("Cat() is a Vehicle? -> ", isinstance(Cat(), Vehicle))  # False

يُستخدم isinstance() للتحقق مما إذا كان كائن ما هو مثيل لفئة معينة، ويُستخدم issubclass() للتحقق مما إذا كانت فئة ما هي فئة فرعية لفئة معينة.۔

الملخص

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

تُعد الفئات التجريدية أداة مهمة في لغة Python تدعم البرمجة الكائنية المرنة، وتعزز إعادة استخدام الفئات وقابلية صيانتها.۔

يمكنك متابعة المقالة أعلاه باستخدام Visual Studio Code على قناتنا على YouTube.۔ يرجى التحقق من القناة على YouTube أيضًا.۔

YouTube Video