0Pricing
Python Academy · درس

الطرق السحرية: __str__ و__repr__

نفّذ طرق dunder لتمثيل الكائنات بصورة سهلة القراءة

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

ما الطرق السحرية؟

الطرق السحرية (dunder) هي طرق خاصة تحتوي على شرطتين سفليتين، وتستدعيها Python في سياقات محددة، مثل الطباعة أو المقارنة.

class Foo:
    def __str__(self):
        return "I am Foo"

f = Foo()
print(f)        # I am Foo
print(str(f))   # I am Foo

__repr__: تمثيل المطوّر

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

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __repr__(self):
        return f"Point({self.x}, {self.y})"

p = Point(3, 4)
print(repr(p))  # Point(3, 4)

__str__: تمثيل المستخدم

يوفّر __str__ سلسلة نصية سهلة الفهم للبشر. وتستدعيه print() وstr(). وإذا لم يكن موجودًا، تستخدم Python __repr__ بديلًا عنه.

class Temperature:
    def __init__(self, celsius):
        self.celsius = celsius

    def __str__(self):
        return f"{self.celsius}°C"

    def __repr__(self):
        return f"Temperature({self.celsius})"

t = Temperature(100)
print(t)        # 100°C
print(repr(t))  # Temperature(100)

متى تُستدعى كل طريقة؟

__str__:‏ print() وstr() وسلاسل f. __repr__:‏ REPL وrepr() والحاويات التي تعرض عناصرها.

class Item:
    def __str__(self): return "str"
    def __repr__(self): return "repr"

x = Item()
print(x)         # str
print([x])       # [repr]  ← list uses repr for elements

__format__ للتنسيق المخصص

عرّف __format__ للتحكم في طريقة عرض كائنك داخل سلاسل f التي تحتوي على مواصفات تنسيق.

class Money:
    def __init__(self, amount):
        self.amount = amount

    def __format__(self, spec):
        if spec == "usd":
            return f"${self.amount:.2f}"
        return str(self.amount)

m = Money(9.5)
print(f"{m:usd}")  # $9.50

__bool__ للقيمة المنطقية

يتيح __bool__ تقييم كائنك في السياقات المنطقية. أعد True أو False.

class Bag:
    def __init__(self, items):
        self.items = items

    def __bool__(self):
        return len(self.items) > 0

b = Bag([])
if not b:
    print("Bag is empty")  # Bag is empty

__len__ للدالة len()

يجعل __len__ التعبير len(obj) صالحًا للاستخدام. كما يُستخدم لتحديد __bool__ عند عدم تعريف __bool__.

class Stack:
    def __init__(self):
        self.data = []

    def push(self, v): self.data.append(v)

    def __len__(self):
        return len(self.data)

s = Stack()
s.push(1)
print(len(s))  # 1

__eq__ للمساواة

عرّف __eq__ لتحديد ما يجعل مثيلين متساويين عند استخدام ==.

class Vector:
    def __init__(self, x, y):
        self.x, self.y = x, y

    def __eq__(self, other):
        return self.x == other.x and self.y == other.y

print(Vector(1,2) == Vector(1,2))  # True

__hash__ مع __eq__

عند تعريف __eq__، تعيّن Python قيمة __hash__ إلى None، فيصبح الكائن غير قابل للتجزئة. عرّف __hash__ أيضًا إذا احتجت إلى استخدام الكائن في المجموعات أو القواميس.

class Point:
    def __init__(self, x, y): self.x, self.y = x, y
    def __eq__(self, o): return (self.x, self.y) == (o.x, o.y)
    def __hash__(self): return hash((self.x, self.y))

pts = {Point(1,2), Point(1,2)}
print(len(pts))  # 1

__add__ والعمليات الحسابية

تقابل معاملات العمليات الحسابية طرق dunder:‏ __add__ للمعامل +، و__sub__ للمعامل -، وغير ذلك.

class Vector:
    def __init__(self, x, y): self.x, self.y = x, y
    def __add__(self, o): return Vector(self.x+o.x, self.y+o.y)
    def __repr__(self): return f"Vector({self.x},{self.y})"

print(Vector(1,2) + Vector(3,4))  # Vector(4,6)

__getitem__ للفهرسة

يتيح __getitem__ لفئتك دعم الفهرسة باستخدام الأقواس المربعة، مثل obj[key].

class Matrix:
    def __init__(self, data):
        self.data = data

    def __getitem__(self, idx):
        return self.data[idx]

m = Matrix([[1,2],[3,4]])
print(m[0])     # [1, 2]
print(m[1][0])  # 3

تحقق سريع

ما طريقة dunder التي تُستدعى عند استخدام print(obj)؟

مراجعة

تمنح الطرق السحرية فئاتك سلوكًا موافقًا لأسلوب Python. يستهدف __repr__ المطوّرين، بينما يستهدف __str__ المستخدمين. عرّف __eq__ و__hash__ وطرق dunder الحسابية لجعل الكائنات متكاملة الوظائف.

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

هل درس «الطرق السحرية: __str__ و__repr__» مجاني؟

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

ماذا ستتعلم في «الطرق السحرية: __str__ و__repr__»؟

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

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

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

كم من الوقت يستغرق درس «الطرق السحرية: __str__ و__repr__»؟

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

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

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

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

  1. الفئات والطريقة __init__
  2. سمات الكائنات مقابل سمات الفئات
  3. طرق الكائن وself
  4. الطرق السحرية: __str__ و__repr__
← العودة إلى Python Academy