توسيع __str __ () بدلاً من استبدالها

أرغب في تمديد __ str __() طريقة الكائن الخاص بي. يتم قراءة str (obj) حاليًا:


تعجبني العنوان كمعرّف فريد ، لكنني أريد إضافة بعض السمات. ما هي أفضل طريقة لتمديد هذا مع الاحتفاظ بجزء العنوان؟ أود أن أبدو شيء من هذا القبيل:


لا أرى أي سمة تخزن العنوان. أنا أستخدم python 2.4.3.

Edit: Would be nice to know how to do this with __repr__()

Solution (for python 2.4.3):

def __repr__(self):
    return "
1
بادئ ذي بدء ، لا تستخدم مثل هذا الإصدار الثعبان عفا عليها الزمن. بالإضافة إلى ذلك ، لما تحاول القيام به هناك __ repr __ .
وأضاف المؤلف ThiefMaster, مصدر

2 إجابة

يمكنك الحصول على العنوان مع id (obj) . ربما تريد تغيير __ repr __() طريقة بدلاً من __ str __() . إليك الرمز الذي سيفعل ذلك في Python 2.6+:

class Test(object):
    def __repr__(self):
        repr_template = ("<{0.__class__.__module__}.{0.__class__.__name__}"
                         " object at {1}: name={0.name}, isValid={0.isValid}>")

        return repr_template.format(self, hex(id(self)))

اختبار مع:

test = Test()
test.name = "foo"
test.isValid = True
print repr(test)
print str(test)
print test

يمكنك بسهولة القيام بنفس الشيء في إصدار أقدم من Python باستخدام عمليات تنسيق سلسلة مثل "٪ s" بدلاً من بناء الجملة str.format() . إذا كنت ستستخدم str.format() ، فيمكنك أيضًا استخدام إمكانية تنسيق ست عشري المضمنة باستخدام {1: #x} في القالب وتغييره الحجة 1 من hex (id (self)) ببساطة id (self) .

5
وأضاف
تم التعديل ليكون لديك إجابة كاملة.
وأضاف المؤلف Michael Hoffman, مصدر
ماذا عن البقيه؟ أرى أن obj .__ class __.__ name__ سيعود إلى الاختبار ، ولكن ماذا عن اسم الوحدة النمطية؟
وأضاف المؤلف shadowland, مصدر
هذا فعلها. كان عليّ فقط استخدام٪ s كما اقترحت.
وأضاف المؤلف shadowland, مصدر
class Mine(object):
    def __str__(self):
        return object.__str__(self) + " own attributes..."
1
وأضاف
هذا لن ينتج الإخراج الذي يرغب به. إنه يريد أن يكون كل شيء بين قوسين معقوفين في مثاله. سيؤدي هذا إلى إرجاع الأصل الموجود في مجموعة خاصة به من أقواس زاوية وإضافة سماته "الخارجية".
وأضاف المؤلف Brandon Buck, مصدر