بيثون: مكالمات متعددة إلى __init __ () على نفس الحالة
-
23-09-2019 - |
سؤال
ال __init__()
يتم استدعاء الوظيفة عند إنشاء الكائن. هل من المقبول استدعاء كائن __init__()
تعمل مرة أخرى ، بعد إنشاءها؟
instance = cls(p1=1, p2=2)
# some code
instance.__init__(p1=123, p2=234)
# some more code
instance.__init__(p1=23, p2=24)
لماذا يريد أي شخص الاتصال __init__()
على كائن تم إنشاؤه بالفعل؟
سؤال جيد. أريد إعادة تخصيص حقول المثيل.
المحلول
من الجيد الاتصال __init__
أكثر من مرة على كائن ، طالما __init__
يتم ترميزه مع التأثير الذي تريد الحصول عليه (مهما كان ذلك). حالة نموذجية حيث تحدث (لذلك يمكنك رمز أفضل __init__
بشكل مناسب!-) هو عندما يكون صفك __new__
الطريقة إرجاع مثيل الفصل: ذلك يفعل لانى __init__
ليتم استدعاؤها على المثيل الذي تم إرجاعه (لما قد يكون الثاني ، أو العشرين ، الوقت ، إذا احتفظت بمثيلات "إعادة التدوير" عبر __new__
!-).
نصائح أخرى
يمكنك ذلك ، لكنه نوع من كسر ما __init__
المقصود القيام به. الكثير من الثعبان هو مجرد اتفاقية ، لذلك قد تتبع ذلك أيضًا وتتوقع __init__
ليتم استدعاؤها مرة واحدة فقط. أوصي بإنشاء وظيفة تسمى init
أو reset
أو شيء يحدد متغيرات المثيل ، استخدم ذلك عندما تريد إعادة ضبط المثيل __init__
اتصل وحسب init
. هذا بالتأكيد يبدو عاقلًا أكثر:
x = Pt(1,2)
x.set(3,4)
x.set(5,10)
على حد علمي ، فإنه لا يسبب أي مشاكل (تعديل: كما اقترح استخدام كوشير super(...).__init__(...)
) ، لكنني أعتقد أن وجود reset()
الطريقة وتسميتها كلاهما __init__()
وعندما تحتاج إلى إعادة التعيين سيكون منظفًا.