كيفية استخدام الأساليب __str__() و __repr__() في لغة البرمجة Python

المقدمة

في هذا المقال، ستتعرف على الأساليب الخاصة __str__() و __repr__() التي تم تعريفها في نموذج البيانات في بايثون. يمكن أن تكون الأساليب __str__() و __repr__() مفيدة في تصحيح أخطاء البرمجة في بايثون من خلال تسجيل أو طباعة معلومات مفيدة حول كائن.

تبدأ الأساليب الخاصة في بايثون وتنتهي بشرطتين مزدوجتين وتعرف غير رسمي بأساليب “داندر”. تعتبر أساليب الداندر هي الأساليب الأساسية لعوامل البناء والوظائف المدمجة في بايثون. يجب تجنب استدعاء أساليب الداندر مباشرةً، وبدلاً من ذلك يجب تنفيذ أساليب الداندر في صنفك ومن ثم استخدام الوظائف المدمجة التي تستدعيها مثل str() و repr().

ما الفرق بين __str__() و __repr__()؟

الطريقة __str__() تُرجع تمثيلًا قابلًا للقراءة بشكل بشري، أو غير رسمي، لكائن. يتم استدعاء هذه الطريقة بواسطة الوظيفة المدمجة print()، str()، و format(). إذا لم تقوم بتعريف طريقة __str__() لفئة ما، فإن تنفيذ الكائن المدمج سيستدعي بدلاً من ذلك طريقة __repr__().

الطريقة __repr__() تُرجع تمثيلًا للكائن أكثر غنى بالمعلومات، أو رسميًا. يتم استدعاء هذه الطريقة بواسطة الوظيفة المدمجة repr(). إذا كان ذلك ممكنًا، يجب أن يكون السلسلة المُرجعة صالحة كتعبير Python يمكن استخدامه لإعادة إنشاء الكائن. في جميع الحالات، يجب أن تكون السلسلة مفيدة وواضحة.

بشكل عام، تُستخدم السلسلة __str__() للمستخدمين والسلسلة __repr__() للمطورين.

أمثلة على استخدام __str__() و __repr__() باستخدام فئة مدمجة

تستدعي الأمثلة في هذا القسم الطرق __str__() و __repr__() مباشرة لأغراض التوضيح.

فئة datetime.datetime هي فئة Python المدمجة التي تحتوي على تنفيذ افتراضي للطرق __str__() و __repr__().

الشيفرة المثالية التالية تظهر السلاسل المُرَجَّعَة بواسطة التنفيذ الافتراضي لطرق __str__() و __repr__() لكائن datetime.datetime:

import datetime

mydate = datetime.datetime.now()

print("__str__() string: ", mydate.__str__())
print("str() string: ", str(mydate))

print("__repr__() string: ", mydate.__repr__())
print("repr() string: ", repr(mydate))

الإخراج هو:

Output
__str__() string: 2023-01-27 09:50:37.429078 str() string: 2023-01-27 09:50:37.429078 __repr__() string: datetime.datetime(2023, 1, 27, 9, 50, 37, 429078) repr() string: datetime.datetime(2023, 1, 27, 9, 50, 37, 429078)

يُظهر الإخراج أن الدالة str() تستدعي __str__() وتُرجِع سلسلة صديقة للإنسان، في حين أن الدالة repr() تستدعي __repr__() وتُرجِع سلسلة أكثر غنى بالمعلومات يمكن استخدامها لإعادة إنشاء الكائن. في الواقع، يُمكنك استخدام دالة repr() مع دالة eval() لإنشاء كائن جديد من السلسلة:

import datetime

mydate1 = datetime.datetime.now()
mydate2 = eval(repr(mydate1))

print("mydate1 repr() string: ", repr(mydate1))
print("mydate2 repr() string: ", repr(mydate2))

print("the values of the objects are equal: ", mydate1==mydate2)

الإخراج هو:

Output
mydate1 repr() string: datetime.datetime(2023, 1, 26, 9, 43, 24, 479635) mydate2 repr() string: datetime.datetime(2023, 1, 26, 9, 43, 24, 479635) the values of the objects are equal: True

الشيفرة المثالية السابقة تُنشئ كائن mydate2 من سلسلة repr() لـ mydate1، ثم تتحقق من أن قيم الكائنين متساوية.

أمثلة على __str__() و __repr__() باستخدام صنف جديد

عند إنشاء صنف، يجب تنفيذ طريقة ___repr__() على الأقل حتى يتم إرجاع معلومات مفيدة عند استخدام الدوال المدمجة __repr__().

الصنف التالي لا يقوم بتنفيذ طريقتي __str__() أو __repr()__:

class Ocean:

    def __init__(self, sea_creature_name, sea_creature_age):
        self.name = sea_creature_name
        self.age = sea_creature_age

c = Ocean('Jellyfish', 5)

print(str(c))
print(repr(c))

الإخراج عند استخدام str() و repr() هو:

Output
<__main__.Ocean object at 0x102892860> <__main__.Ocean object at 0x102892860>

المثال السابق يظهر أن التنفيذ الافتراضي لدالة __repr()__ للكائن يعيد سلسلة نصية تحتوي فقط على الفئة ومعرف الكائن بتنسيق سداسي عشر، والذي لا يكون مفيدًا تمامًا. يرجى مراعاة أن str() و repr() تعيدان نفس القيمة، لأن str() تستدعي __repr__() عندما لا يتم تنفيذ __str__().

قم بتحديث فئة Ocean بتنفيذات للأساليب __str__() و __repr__():

class Ocean:

    def __init__(self, sea_creature_name, sea_creature_age):
        self.name = sea_creature_name
        self.age = sea_creature_age
    
    def __str__(self):
        return f'The creature type is {self.name} and the age is {self.age}'

    def __repr__(self):
        return f'Ocean(\'{self.name}\', {self.age})'

c = Ocean('Jellyfish', 5)

print(str(c))
print(repr(c))

الناتج هو:

Output
The creature type is Jellyfish and the age is 5 Ocean('Jellyfish', 5)

تقوم تنفيذات __str__() في المثال السابق بإعادة سلسلة نصية سهلة القراءة تقدم التفاصيل ذات الصلة للكائن للمستخدم. تنفيذ __repr__() يعيد سلسلة نصية هي عبارة عن تعبير Python صالح يمكن استخدامه لإعادة إنشاء الكائن: Ocean('Jellyfish', 5). يستخدم المثال تنسيق السلاسل باستخدام f-string للسلاسل، ولكن يمكنك تنسيق السلاسل باستخدام أي تنسيق مدعوم من قبل Python.

الاستنتاج

في هذا المقال، استكشفت الفروق بين الطرق __str__() و __repr__() ونفذت هذه الطرق الخاصة في صنف، بحيث لم تحتاج إلى استدعائها مباشرة. تعرف أكثر على كيفية العمل مع السلاسل في Python من خلال دروس سلاسل Python لدينا.

Source:
https://www.digitalocean.com/community/tutorials/python-str-repr-functions