خيارات التجميد والمقارنة
أنشئ dataclasses غير قابلة للتغيير ومرتبة
خيارات التجميد والمقارنة درس مجاني في Python Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Python Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Python Academy 4 دروس في المجموع.
خيارات المزخرف
يقبل المزخرف @dataclass وسيطات كلمات مفتاحية تتحكم في الأساليب التي ينشئها. ومن أكثرها فائدة frozen وorder.
- يجعل
frozen=Trueالمثيلات غير قابلة للتغيير. - يضيف
order=Trueمعاملات المقارنة.
Dataclasses غير قابلة للتغيير
مع frozen=True، تمنع الفئة التي يتم إنشاؤها تلقائيًا إسناد السمات بعد الإنشاء. وترفع أي محاولة استثناء FrozenInstanceError.
from dataclasses import dataclass, FrozenInstanceError
@dataclass(frozen=True)
class Point:
x: int
y: int
p = Point(1, 2)
try:
p.x = 99
except FrozenInstanceError as e:
print('Cannot modify:', e)لماذا تفيد عدم القابلية للتغيير؟
تسهل الكائنات غير القابلة للتغيير فهم الشيفرة: فقيمتها لا تتغير بعد الإنشاء، لذا يمكن مشاركتها بأمان بين الدوال وخيوط التنفيذ. كما يمكن استخدامها بأمان كمفاتيح للقواميس وأعضاء للمجموعات.
التجميد يعني القابلية للتجزئة
تكون فئة البيانات المجمّدة قابلة للتجزئة تلقائيًا، لذا يمكنكم استخدام مثيلاتها في المجموعات أو كمفاتيح للقواميس. أما فئات البيانات القابلة للتغيير فلا تكون قابلة للتجزئة، إلا إذا فعّلتم ذلك صراحةً.
from dataclasses import dataclass
@dataclass(frozen=True)
class Point:
x: int
y: int
seen = {Point(0, 0), Point(1, 1), Point(0, 0)}
print(len(seen))استبدال القيم المجمّدة
نظرًا إلى أنه لا يمكنكم تغيير مثيل مجمّد، استخدموا dataclasses.replace() لإنشاء نسخة معدّلة. ويظل المثيل الأصلي دون تغيير.
from dataclasses import dataclass, replace
@dataclass(frozen=True)
class Point:
x: int
y: int
p = Point(1, 2)
q = replace(p, y=99)
print(p)
print(q)فئات البيانات المرتبة
تدعم فئة البيانات تلقائيًا العامل == فقط. أضيفوا order=True لإنشاء العوامل < و<= و> و>= أيضًا.
from dataclasses import dataclass
@dataclass(order=True)
class Version:
major: int
minor: int
print(Version(1, 2) < Version(1, 5))
print(Version(2, 0) > Version(1, 9))كيفية إجراء المقارنة عند الترتيب
تقارن عملية الترتيب الحقول باعتبارها صفًا، من اليسار إلى اليمين، وفق ترتيب التصريح بها. ويكون الحقل الأول هو الأكثر أهمية.
from dataclasses import dataclass
@dataclass(order=True)
class Version:
major: int
minor: int
# major compared first, then minor
print(Version(1, 9) < Version(2, 0))فرز مثيلات فئة البيانات
بما أن فئات البيانات المرتبة تعرّف عوامل المقارنة، يمكنكم فرز قائمة منها مباشرةً باستخدام sorted().
from dataclasses import dataclass
@dataclass(order=True)
class Score:
points: int
name: str
data = [Score(50, 'B'), Score(90, 'A'), Score(70, 'C')]
for s in sorted(data):
print(s)التحكم في مفتاح الفرز
للفرز وفق شيء آخر غير الترتيب الطبيعي للحقول، ضعوا حقل فرز مخفيًا في البداية باستخدام field(init=False)، واضبطوه في __post_init__. ويمكن استبعاد الحقول الأخرى من المقارنة باستخدام compare=False.
from dataclasses import dataclass, field
@dataclass(order=True)
class Item:
sort_index: int = field(init=False, repr=False)
name: str = field(compare=False, default='')
priority: int = 0
def __post_init__(self):
self.sort_index = self.priority
print(Item(name='b', priority=2) > Item(name='a', priority=1))دمج خياري frozen وorder
يمكنكم دمج الخيارات. ففئة البيانات المجمّدة والمرتبة تمثّل نوعًا مثاليًا لقيمة غير قابلة للتغيير وقابلة للمقارنة، وهي مناسبة جدًا للمفاتيح أو أرقام الإصدارات أو الإحداثيات.
from dataclasses import dataclass
@dataclass(frozen=True, order=True)
class SemVer:
major: int
minor: int
patch: int
versions = {SemVer(1, 0, 0): 'stable'}
print(SemVer(1, 0, 0) < SemVer(1, 1, 0))
print(versions[SemVer(1, 0, 0)])الخيار eq والقيمة الافتراضية
يتحكم الخيار eq في إنشاء __eq__. وتكون قيمته True افتراضيًا. لاحظوا أن order=True يتطلب eq=True، لأن الترتيب يعتمد على المساواة.
from dataclasses import dataclass
@dataclass(eq=True)
class Tag:
name: str
print(Tag('x') == Tag('x'))
print(Tag('x') == Tag('y'))اختبار سريع
ماذا يحدث إذا أسندتم قيمة إلى حقل في مثيل فئة بيانات مجمّدة؟
مراجعة
تعلّمتم إنشاء فئات بيانات غير قابلة للتغيير ومرتبة.
- يمنع
frozen=Trueالتغيير ويجعل المثيلات قابلة للتجزئة. - استخدموا
replace()لإنشاء نسخ معدّلة. - ينشئ
order=Trueعوامل مقارنة تقارن الحقول باعتبارها صفًا. - ادمجوا الخيارين لإنشاء أنواع متينة للقيم.
الأسئلة الشائعة
هل درس «خيارات التجميد والمقارنة» مجاني؟
نعم — نص درس «خيارات التجميد والمقارنة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Python Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Python Academy 4 دروس في المجموع.
ماذا ستتعلم في «خيارات التجميد والمقارنة»؟
أنشئ dataclasses غير قابلة للتغيير ومرتبة تتمرن على Python Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Python Academy؟
لا تُشترط خبرة سابقة. Python Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «خيارات التجميد والمقارنة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Python Academy هذا؟
نعم. كل درس في Python Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- تعريف Dataclass
- القيم الافتراضية وخيارات field()
- خيارات التجميد والمقارنة
- مكتبة attrs