القيم الافتراضية وخيارات field()
حدّد القيم الافتراضية واستخدم خيارات field()
القيم الافتراضية وخيارات field() درس مجاني في Python Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Python Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Python Academy 4 دروس في المجموع.
تعيين قيم افتراضية للحقول
مثل معلمات الدوال، يمكن أن تكون لحقول dataclass قيم افتراضية. ويمكن حذف الحقل ذي القيمة الافتراضية عند إنشاء المثيل.
from dataclasses import dataclass
@dataclass
class Server:
host: str
port: int = 8080
print(Server('localhost'))
print(Server('example.com', 443))الترتيب مهم
يجب أن تأتي الحقول ذات القيم الافتراضية بعد الحقول التي لا تملك قيمًا افتراضية، تمامًا مثل معاملات الدوال. وإلا فسترفع Python استثناء TypeError عند تعريف الفئة.
from dataclasses import dataclass
@dataclass
class User:
name: str # required
active: bool = True # optional
print(User('Alice'))مشكلة القيمة الافتراضية القابلة للتغيير
لا يمكنك استخدام كائن قابل للتغيير، مثل قائمة أو قاموس، كقيمة افتراضية مباشرة. إذ ستشارك جميع المثيلات الكائن نفسه. تكتشف Python ذلك وترفع استثناء ValueError لحمايتك.
from dataclasses import dataclass
from typing import List
# This raises ValueError at class definition time:
try:
@dataclass
class Bad:
items: List[int] = []
except ValueError as e:
print('Error:', e)field(default_factory=...)
لتعيين قيمة افتراضية قابلة للتغيير، استخدم field(default_factory=...). ويتم استدعاء المصنع لكل مثيل جديد، لذا يحصل كل مثيل على كائن جديد خاص به.
from dataclasses import dataclass, field
from typing import List
@dataclass
class Cart:
items: List[str] = field(default_factory=list)
a = Cart()
a.items.append('apple')
b = Cart()
print(a.items, b.items)default في مقابل default_factory
استخدم field(default=...) للقيم غير القابلة للتغيير عندما تحتاج أيضًا إلى خيارات أخرى من field(). واستخدم default_factory لأي قيمة قابلة للتغيير. ولا يمكنك تمرير الخيارين معًا.
from dataclasses import dataclass, field
@dataclass
class Config:
retries: int = field(default=3)
tags: list = field(default_factory=list)
print(Config())استبعاد حقل من repr
يخفي الخيار repr=False حقلًا من __repr__ الذي يتم إنشاؤه تلقائيًا. وهذا مفيد للأسرار أو للمخازن المؤقتة الداخلية الكبيرة.
from dataclasses import dataclass, field
@dataclass
class Account:
user: str
token: str = field(repr=False, default='secret')
print(Account('alice'))استبعاد حقل من المقارنة
مع compare=False، يتجاهل __eq__ الذي يتم إنشاؤه تلقائيًا الحقلَ (وكذلك الترتيب). ويمكن أن يتساوى مثيلان حتى إذا اختلف هذا الحقل.
from dataclasses import dataclass, field
@dataclass
class Event:
name: str
timestamp: float = field(compare=False, default=0.0)
print(Event('login', 1.0) == Event('login', 99.0))حقول init=False
يُبقي ضبط init=False الحقل خارج __init__. وعادةً ما تجمعه مع قيمة افتراضية أو تضبطه في __post_init__.
from dataclasses import dataclass, field
@dataclass
class Circle:
radius: float
area: float = field(init=False, default=0.0)
c = Circle(2.0)
print(c)__post_init__ للقيم المشتقة
عرّف __post_init__ لتشغيل الشيفرة مباشرةً بعد __init__ الذي يتم إنشاؤه تلقائيًا. وهو المكان الطبيعي لحساب الحقول المشتقة من حقول أخرى.
from dataclasses import dataclass, field
@dataclass
class Circle:
radius: float
area: float = field(init=False, default=0.0)
def __post_init__(self):
self.area = 3.14159 * self.radius ** 2
print(Circle(2.0))تخزين البيانات الوصفية
تربط الوسيطة metadata أي تعيين اختياري بحقل. وتتجاهله Python، لكن يمكن للأدوات وشيفرتك الخاصة قراءته للاستفادة منه في التوثيق أو تلميحات التحقق.
from dataclasses import dataclass, field, fields
@dataclass
class Product:
price: float = field(metadata={'unit': 'USD'})
for f in fields(Product):
print(f.name, f.metadata)دمج خيارات field()
تتراكم الخيارات. فيمكن لحقل واحد أن يخفي نفسه من repr، ويُستبعد من المقارنة، ويحمل قيمة افتراضية في الوقت نفسه.
from dataclasses import dataclass, field
@dataclass
class Session:
user: str
token: str = field(default='x', repr=False, compare=False)
print(Session('alice'))
print(Session('alice') == Session('alice', token='different'))تحقق سريع
كيف تمنح حقلًا في dataclass قائمة فارغة افتراضية؟
مراجعة
تعلمت تعيين القيم الافتراضية واستخدام خيارات field().
- تأتي الحقول ذات القيم الافتراضية بعد الحقول المطلوبة.
- استخدم
default_factoryللقيم الافتراضية القابلة للتغيير. - تضبط الخيارات
reprوcompareوinitوmetadataسلوك كل حقل. - تحسب
__post_init__القيم المشتقة.
الأسئلة الشائعة
هل درس «القيم الافتراضية وخيارات field()» مجاني؟
نعم — نص درس «القيم الافتراضية وخيارات field()» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Python Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Python Academy 4 دروس في المجموع.
ماذا ستتعلم في «القيم الافتراضية وخيارات field()»؟
حدّد القيم الافتراضية واستخدم خيارات field() تتمرن على Python Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Python Academy؟
لا تُشترط خبرة سابقة. Python Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «القيم الافتراضية وخيارات field()»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Python Academy هذا؟
نعم. كل درس في Python Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- تعريف Dataclass
- القيم الافتراضية وخيارات field()
- خيارات التجميد والمقارنة
- مكتبة attrs