كيفية إنشاء فئات Python
افهم type والصنف الوصفي الافتراضي وخطافات إنشاء الفئات
كيفية إنشاء فئات Python درس مجاني في Python Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Python Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Python Academy 4 دروس في المجموع.
type() هو صنف فوقي
كل صنف في Python هو مثيل من type. وtype نفسه صنف، وهو الصنف الفوقي لجميع الأصناف الفوقية.
# These are equivalent:
class Dog:
sound = "woof"
Dog2 = type("Dog2", (), {"sound": "woof"})
print(type(Dog)) # <class 'type'>
print(type(Dog2)) # <class 'type'>الصيغة ذات الوسائط الثلاثة لـ type()
تنشئ type(name, bases, namespace) صنفًا جديدًا ديناميكيًا. وهذا بالضبط ما تفعله عبارات class من وراء الكواليس.
Animal = type("Animal", (), {"speak": lambda self: "..."})
Dog = type("Dog", (Animal,), {"speak": lambda self: "woof"})
d = Dog()
print(d.speak()) # woofخطوات إنشاء الصنف
عندما ترى Python عبارة class فإنها: 1) تحلّ الصنف الفوقي، 2) تجهّز مساحة الأسماء، 3) تنفّذ جسم الصنف، 4) تستدعي metaclass(name, bases, namespace).
# class Foo(Base, metaclass=Meta):
# x = 1
#
# Equivalent to:
# namespace = Meta.__prepare__("Foo", (Base,))
# exec(class_body, namespace)
# Foo = Meta("Foo", (Base,), namespace)__prepare__
إن __prepare__(name, bases, **kw) أسلوب صنفي في الصنف الفوقي، ويعيد قاموس مساحة الأسماء المستخدم أثناء تنفيذ جسم الصنف. تجاوز هذا الأسلوب لاستخدام OrderedDict أو تعيين مخصّص.
class OrderedMeta(type):
@classmethod
def __prepare__(mcs, name, bases, **kw):
print(f"Preparing namespace for {name}")
return {}
class MyClass(metaclass=OrderedMeta):
x = 1
y = 2__new__ مقابل __init__ في type
ينشئ type.__new__ كائن الصنف، بينما يهيّئه type.__init__. وفي الأصناف الفوقية، تجاوز __new__ لتخصيص إنشاء الصنف.
class Singleton(type):
_instances = {}
def __call__(cls, *args, **kw):
if cls not in cls._instances:
cls._instances[cls] = super().__call__(*args, **kw)
return cls._instances[cls]
class DB(metaclass=Singleton):
pass
print(DB() is DB()) # Trueمُزيّنات الأصناف مقابل الأصناف الفوقية
تطبّق مُزيّنات الأصناف التعديلات بعد الإنشاء، بينما تتحكم الأصناف الفوقية في عملية الإنشاء نفسها. ولإجراء تحسينات بسيطة، يُفضّل استخدام المُزيّنات. استخدم الأصناف الفوقية عندما تحتاج إلى التأثير في عملية الإنشاء.
def add_repr(cls):
cls.__repr__ = lambda self: f"{cls.__name__}()"
return cls
@add_repr
class Widget:
pass
print(Widget()) # Widget()__init_subclass__
يُستدعى __init_subclass__ على الصنف الأساسي كلما عُرّف صنف فرعي. وهو بديل خفيف للأصناف الفوقية لتخصيص سلوك الأصناف الفرعية.
class Plugin:
_registry = []
def __init_subclass__(cls, **kw):
super().__init_subclass__(**kw)
Plugin._registry.append(cls)
class AudioPlugin(Plugin): pass
class VideoPlugin(Plugin): pass
print(Plugin._registry) # [AudioPlugin, VideoPlugin]ABCMeta
إن ABCMeta صنف فوقي مضمّن يدعم الأصناف الأساسية المجرّدة من خلال @abstractmethod.
from abc import ABCMeta, abstractmethod
class Shape(metaclass=ABCMeta):
@abstractmethod
def area(self): ...
class Circle(Shape):
def __init__(self, r): self.r = r
def area(self): return 3.14159 * self.r ** 2
# Shape() # TypeError: Can't instantiate abstract classفحص الصنف الفوقي لصنف
استخدم type(cls) للعثور على الصنف الفوقي لصنف، واستخدم cls.__mro__ لعرض ترتيب حل الأساليب.
class Meta(type): pass
class Foo(metaclass=Meta): pass
print(type(Foo)) # <class '__main__.Meta'>
print(Foo.__mro__) # (Foo, object)وراثة الصنف الفوقي
يرث الصنف الفوقي للصنف أصنافه الفرعية. وإذا كان لصنفين أساسيين صنفان فوقيان مختلفان، فيجب استخدام الصنف الفوقي الأكثر اشتقاقًا، وإلا فسيحدث تعارض.
class MyMeta(type): pass
class Base(metaclass=MyMeta): pass
class Child(Base): pass # Child's metaclass is also MyMeta
print(type(Child)) # <class '__main__.MyMeta'>متى تستخدم الأصناف الفوقية
استخدم الأصناف الفوقية لتسجيل الأصناف الفرعية تلقائيًا، وفرض ثوابت الأصناف، واكتشاف حقول ORM مثل Model في Django، وتوجيه أطر API. وفي معظم الحالات، استخدم __init_subclass__ أو مُزيّنات الأصناف بدلًا منها.
# Real-world: Django ORM uses ModelBase metaclass
# to collect field definitions into _meta
# You rarely need a custom metaclass;
# __init_subclass__ covers most plugin/registration patternsتحقق سريع
ماذا تفعل type("Dog", (Animal,), {"speak": lambda self: "woof"})؟
مراجعة
كل صنف هو مثيل من type. يتألف مسار إنشاء الصنف من: حل الصنف الفوقي ← تجهيز مساحة الأسماء ← تنفيذ الجسم ← استدعاء الصنف الفوقي. يُفضّل استخدام __init_subclass__ لخطافات الأصناف الفرعية البسيطة، ولا تستخدم صنفًا فوقيًا كاملًا إلا عندما تحتاج إلى التحكم في إنشاء الصنف نفسه.
الأسئلة الشائعة
هل درس «كيفية إنشاء فئات Python» مجاني؟
نعم — نص درس «كيفية إنشاء فئات Python» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Python Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Python Academy 4 دروس في المجموع.
ماذا ستتعلم في «كيفية إنشاء فئات Python»؟
افهم type والصنف الوصفي الافتراضي وخطافات إنشاء الفئات تتمرن على Python Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Python Academy؟
لا تُشترط خبرة سابقة. Python Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «كيفية إنشاء فئات Python»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Python Academy هذا؟
نعم. كل درس في Python Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- كيفية إنشاء فئات Python
- كتابة أصناف وصفية مخصصة
- واصفات الخصائص: __get__ و__set__ و__delete__
- __slots__ وتحسين الذاكرة