Property Decorators
جزء من قسم Object Oriented Programming في رحلة Python على Coddy — الدرس 14 من 64.
تتيح لك مزخرفات الخصائص (Property decorators) التحكم في كيفية الوصول إلى السمات وتعديلها، مع الحفاظ على صيغة السمات البسيطة.
إليك مثال على فئة (class) تحتوي على أداة جلب الخصائص (property getter):
class Person:
def __init__(self, name, age):
self._name = name
self._age = age
@property
def age(self):
return self._ageاستخدم الخاصية كسمة عادية:
person = Person("Alice", 30)
print(person.age)الناتج:
30لاحظ أنك تصل إلى age بدون أقواس، على الرغم من أنها تستدعي طريقة (method) في الواقع.
أضف دالة تعيين (setter) للتحقق من صحة البيانات عند تعيين القيم:
class Person:
def __init__(self, name, age):
self._name = name
self._age = age
@property
def age(self):
return self._age
@age.setter
def age(self, value):
if value < 0:
raise ValueError("Age cannot be negative")
self._age = valueالآن يمكنك تعيين العمر مع التحقق التلقائي من الصحة:
person = Person("Alice", 30)
person.age = 31 # يستخدم الـ setter مع التحقق من الصحة
print(person.age) # يستخدم الـ getter
# سيؤدي هذا إلى حدوث خطأ:
# person.age = -5 # ValueError: لا يمكن أن يكون العمر سالباًالناتج:
31أنشئ خصائص محسوبة تقوم بحساب القيم:
class Rectangle:
def __init__(self, width, height):
self.width = width
self.height = height
@property
def area(self):
return self.width * self.height
rect = Rectangle(5, 3)
print(rect.area) # يحسب 5 * 3 = 15المخرجات:
15نقطة رئيسية: تجعل مزخرفات الخصائص (Property decorators) الأساليب تبدو كسمات. استخدم @property للمسترجعات (getters) و @attribute_name.setter للمعينات (setters). يسمح هذا بالتحقق من صحة البيانات والقيم المحسوبة مع الحفاظ على صيغة وصول بسيطة للسمات.
التحدي
متوسطأكمل فئة Temperature في temperature.py التي تقوم بالتحويل بين Celsius و Fahrenheit. ثم استخدم هذه الفئة في driver.py لاختبار تحويلات درجات الحرارة. اتبع تعليقات TODO في كلا الملفين للحصول على تعليمات خطوة بخطوة.
ورقة مرجعية
تسمح لك مزخرفات الخصائص (Property decorators) بالتحكم في كيفية الوصول إلى السمات وتعديلها مع الحفاظ على صيغة سمات بسيطة.
استخدم @property لطرق الحصول (getter methods):
class Person:
def __init__(self, name, age):
self._name = name
self._age = age
@property
def age(self):
return self._age
person = Person("Alice", 30)
print(person.age) # الوصول إليها مثل السمة، بدون أقواساستخدم @attribute_name.setter لطرق التعيين (setter methods) مع التحقق من الصحة:
class Person:
def __init__(self, name, age):
self._name = name
self._age = age
@property
def age(self):
return self._age
@age.setter
def age(self, value):
if value < 0:
raise ValueError("Age cannot be negative")
self._age = value
person = Person("Alice", 30)
person.age = 31 # يستخدم طريقة التعيين مع التحقق من الصحةإنشاء خصائص محسوبة تقوم بحساب القيم:
class Rectangle:
def __init__(self, width, height):
self.width = width
self.height = height
@property
def area(self):
return self.width * self.height
rect = Rectangle(5, 3)
print(rect.area) # يحسب 5 * 3 = 15جرّب بنفسك
# TODO: استيراد فئة Temperature من وحدة temperature
# اختبار الفئة:
# TODO: إنشاء مثيل لدرجة الحرارة عند 25 درجة مئوية
temp = None # استبدله بمثيل Temperature الفعلي
# TODO: طباعة قيم كل من السيلزيوس والفهرنهايت
# TODO: استخدم التنسيق: "25.0°C is 77.0°F"
# TODO: ضبط درجة الحرارة على 98.6 فهرنهايت
# TODO: طباعة القيمتين مرة أخرى للتأكد من أن التحويل يعمل
# TODO: استخدم نفس التنسيق السابقيتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Object Oriented Programming
1أساسيات OOP
الملفات الخارجيةمقدمة في OOPClasses مقابل Objectsمعامل selfMethodsAttributesدالة البناء (__init__)مراجعة - آلة حاسبة بسيطة4الوراثة
الوراثة الأساسيةدالة ()superإعادة تعريف الدوال (Method Overriding)الوراثة المتعددةترتيب استدعاء الدوال (Method Resolution Order)مراجعة - هيكلية الموظفين5تعدد الأشكال
مراجعة إعادة تعريف الدوالمفهوم Duck Typingالأصناف والدوال المجردةتصميم الواجهاتملخص - حاسبة الأشكال3خصائص الـ Class
متغيرات الـ Instance مقابل متغيرات الـ ClassProperty Decoratorsالسمات الخاصةمراجعة - مدير الحساب البنكي