में __init__ को ओवरराइड करने के लिए __new__ का उपयोग करना, मुझे __new__
कार्यक्षमता का उपयोग करने में दिलचस्पी है __init__
सबक्लास के कार्य में कोड इंजेक्ट करने के लिए। प्रलेखन से मेरी समझ यह है कि __new__
द्वारा लौटाए गए उदाहरण पर पायथन __init__
पर कॉल करेगा। हालांकि, __new__
से इसे वापस करने से पहले उदाहरण में __init__
के मान को बदलने के मेरे प्रयासों को काम नहीं लगता है।सबक्लास
class Parent(object):
def __new__(cls, *args, **kwargs):
new_object = super(Parent, cls).__new__(cls)
user_init = new_object.__init__
def __init__(self, *args, **kwargs):
print("New __init__ called")
user_init(self, *args, **kwargs)
self.extra()
print("Replacing __init__")
setattr(new_object, '__init__', __init__)
return new_object
def extra(self):
print("Extra called")
class Child(Parent):
def __init__(self):
print("Original __init__ called")
super(Child, self).__init__()
c = Child()
ऊपर कोड प्रिंट:
Replacing __init__
Original __init__ called
लेकिन मैं इसे
Replacing __init__
New __init__ called
Original __init__ called
Extra called
क्यों नहीं मुद्रित करने के लिए उम्मीद करेंगे?
मुझे लगता है कि पाइथन __init__
के मूल मूल्य को कॉल कर रहा है, भले ही मैंने इसे __new__
में सेट किया हो। c.__init__
पर आत्मनिरीक्षण चलाने से पता चलता है कि नया संस्करण जगह पर है, लेकिन इसे ऑब्जेक्ट सृजन का हिस्सा नहीं कहा गया है।
आपका प्रश्न क्या है? – cat