0Pricing
Python Academy · درس

المزخرف @property

استخدم property لإنشاء دوال القراءة والتعيين والحذف

المزخرف @property درس مجاني في Python Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Python Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Python Academy 4 دروس في المجموع.

مقدمة

تحوّل ‎@property‎ الأسلوب إلى خاصية يمكن قراءتها. ويكمل ‎@setter‎ و‎@deleter‎ نمط الوصول المتحكَّم فيه.

لماذا ‎@property‎؟

بدلًا من أسلوبي ‎getX()/setX()‎ على طريقة Java، تستخدم Python ‏‎@property‎. ويبدو الوصول كالوصول إلى خاصية: ‎obj.value‎، لا ‎obj.get_value()‎.
class Circle:
    def __init__(self, r): self._r = r
    @property
    def radius(self): return self._r
c = Circle(5)
print(c.radius)  # no ()

الخصائص المحسوبة

تحسب أساليب ‎@property‎ القيمة عند الحاجة. فمثلًا تحسب ‎obj.area‎ المساحة في كل مرة تصل فيها إليها، من دون الحاجة إلى تخزين قيمة.
import math
class Circle:
    def __init__(self, r): self._r = r
    @property
    def area(self): return math.pi * self._r**2
c = Circle(5)
print(round(c.area, 2))

مُعيّن الخاصية

يضيف ‎@property_name.setter‎ مُعيّنًا. وعندها يستدعي ‎c.radius = 10‎ أسلوب المُعيّن.
class Circle:
    def __init__(self, r): self._r = r
    @property
    def radius(self): return self._r
    @radius.setter
    def radius(self, val):
        if val <= 0: raise ValueError('radius must be positive')
        self._r = val
c = Circle(5)
c.radius = 10
print(c.radius)

حاذف الخاصية

يتولى ‎@property_name.deleter‎ معالجة ‎del obj.attr‎. استخدمه لمنطق التنظيف.
class User:
    def __init__(self, name): self._name = name
    @property
    def name(self): return self._name
    @name.deleter
    def name(self): del self._name
u = User('Alice')
del u.name
print(hasattr(u, '_name'))

خاصية للقراءة فقط

عرّف المُلتقط فقط، من دون مُعيّن. وتؤدي محاولة الإسناد إلى رفع ‎AttributeError‎.
class Const:
    def __init__(self, v): self._v = v
    @property
    def value(self): return self._v
c = Const(42)
print(c.value)
try: c.value = 99
except AttributeError as e: print(e)

خاصية مع التحقق

تُعد المُعيّنات المكان المثالي للتحقق من البيانات — فتحقّق من النوع أو النطاق أو التنسيق قبل التخزين.
class BoundedInt:
    def __init__(self, lo, hi): self.lo,self.hi=lo,hi; self._v=lo
    @property
    def value(self): return self._v
    @value.setter
    def value(self, v):
        if not self.lo <= v <= self.hi:
            raise ValueError(f'{v} out of [{self.lo},{self.hi}]')
        self._v = v
b = BoundedInt(0, 10)
b.value = 5
print(b.value)

التخزين المؤقت باستخدام ‎property‎

اجمع بين ‎@property‎ وقيمة مخزنة مؤقتًا لإجراء الحساب مرة واحدة وحفظ النتيجة مؤقتًا.
class Expensive:
    _cache = None
    @property
    def result(self):
        if self._cache is None:
            self._cache = sum(range(1000))
        return self._cache
e = Expensive()
print(e.result)
print(e.result)

‎cached_property‎ ‏(Python 3.8 فأحدث)

تحسب ‎@functools.cached_property‎ الخاصية مرة واحدة وتخزّنها كخاصية للكائن — فلا يتكرر الحساب.
from functools import cached_property
import math
class Circle:
    def __init__(self, r): self.r = r
    @cached_property
    def area(self): return math.pi * self.r**2
c = Circle(5)
print(round(c.area, 2))

‎property‎ مقابل ‎__slots__‎

يمنع ‎__slots__‎ إنشاء خصائص عشوائية ويوفّر الذاكرة. أما الخصائص فتضيف منطقًا. ويمكن استخدامهما معًا.
class Point:
    __slots__ = ('_x', '_y')
    def __init__(self, x, y): self._x,self._y=x,y
    @property
    def x(self): return self._x
p = Point(1, 2)
print(p.x)

متى تستخدم ‎@property‎؟

استخدم ‎@property‎ عندما تحتاج إلى التحقق، أو القيم المحسوبة، أو الحفاظ على التوافق مع الإصدارات السابقة أثناء تغيير التفاصيل الداخلية.
# Before: class Person:
#     def __init__(self, age): self.age = age
# After: add validation without changing caller code
class Person:
    def __init__(self, age): self.age = age
    @property
    def age(self): return self._age
    @age.setter
    def age(self, v):
        if v < 0: raise ValueError('negative age')
        self._age = v
p = Person(30)
print(p.age)

تحقق سريع

ماذا يحدث عند محاولة الإسناد إلى ‎@property‎ للقراءة فقط، من دون تعريف مُعيّن؟

مراجعة

‎@property‎: يحوّل المُلتقط الوصول إلى الخاصية. ويضيف ‎@name.setter‎ دعم الكتابة. ويضيف ‎@name.deleter‎ دعم ‎del‎. وتحسب ‎@cached_property‎ القيمة مرة واحدة. وتُستخدم المُعيّنات للتحقق.

واصل التقدم

تقدم ممتاز! واصل التقدم لإتقان المفهوم التالي.

الأسئلة الشائعة

هل درس «المزخرف @property» مجاني؟

نعم — نص درس «المزخرف @property» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Python Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Python Academy 4 دروس في المجموع.

ماذا ستتعلم في «المزخرف @property»؟

استخدم property لإنشاء دوال القراءة والتعيين والحذف تتمرن على Python Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Python Academy؟

لا تُشترط خبرة سابقة. Python Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «المزخرف @property»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Python Academy هذا؟

نعم. كل درس في Python Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. الدوال ككائنات من الدرجة الأولى
  2. كتابة مزخرفات مخصصة
  3. المزخرف @property
  4. @classmethod و@staticmethod
← العودة إلى Python Academy