بيثون: مكالمات متعددة إلى __init __ () على نفس الحالة

StackOverflow https://stackoverflow.com/questions/2144988

  •  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__() وعندما تحتاج إلى إعادة التعيين سيكون منظفًا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top