اذهب إلى المحتوى

السؤال

نشر

عندما أقوم بطباعة أي صنف في بايثون أحصل على نتيجة مشابهة للتالي:

<__main__.Foo instance at 0x7fa2b29d>

هل توجد طريقة لعمل مثل هذه النتيجة عند طباعة صنف قمت بإنشائه بنفسي، بحيث يتم طباعة هذه النتيجة عند إستخدام دالة print لطباعة instance من الصنف 

 

Recommended Posts

  • 1
نشر

تستطيع إعادة تعريف التابع __str__ من خلال الصنف وسيتم تنفيذ محتواه عند إستخدام طباعة كائن من ذلك الصنف:

class Foo:
    def __str__(self):
        return "instance of foo"


foo = Foo()
print(foo) # instance of foo

و تستطيع إعادة تعريف التابع __repr__ الذي سيتم تنفيذه في حالة إستدعاء الدالة ()repr او إستدعاء الكائن مباشرة من الواجهة التفاعلية لبايثون:

>>> class Foo:
...     def __repr__(self):
...         return "Foo"
...     def __str__(self):
...         return "instance of foo"
...
>>> foo = Foo()
>>> print(foo)
instance of foo
>>> repr(foo)
'Foo'
>>> foo
Foo
  • 0
نشر

يمكنك أيضاً طباعة المعلومات الخاصة بأي Class أو Object في بايثون بعدة طرق، منها إستخدام dir، vars أو بإستخدام inspect.

في المثال التالي سنقوم بإستخدام dir و التي تطبع كل خصائص Object أو Class مرتبة في شكل قائمة، لاحظ مخرج المثال التالي:

class Test:
   def __init__ (self):
      self.value = 3

test = Test()
dir(test)

بعد تعريف Test Class و بداخله دالة الإنشاء التي تعرف متغير قيمته 3، قمنا بتعريف Object وأسميناه test، طباعة dir(test) أنتجت كل خصائص الObject.

أما ما قمت بطباعته هو فقط طباعة لObject أو Class نفسه ولا يقوم بعرض المحتويات، راجع المثال التالي:

print(test)
<__main__.Test object at 0x7f695dfe1e50>

طباعة test object أعطانا نفس الناتج الذي حصلت عليه في عملية الطباعة المنفذة في برنامجك، والناتج عبارة عن نسخة (Object) معرف من Class المسمى Test و الموجود داخل main وهو عبارة عن base_program و الموجود في موقع الذاكرة 0x7f695dfe1e50.

  • 0
نشر

يمكنك إستخدام __repr__ و __str__ كما في إجابة @عبود سمير

اما إذا أردت إستخدم طريقة أسرع فيمكنك إستخدام دالة objprint والذي تقوم بطباعة محتوى أي صنف على شكل قابل للقراءة

يمكنك تثبيت الحزمة

pip install objprint

واستخدامها لطباعة أي كائن كالمثال الآتي

from objprint import objprint

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

class Player:
    def __init__(self):
        self.name = "Alice"
        self.age = 18
        self.items = ["axe", "armor"]
        self.coins = {"gold": 1, "silver": 33, "bronze": 57}
        self.position = Position(3, 5)

objprint(Player())

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...