किसी बिल्टिन प्रकार के साथ-साथ किसी अन्य वर्ग से प्राप्त होने पर, ऐसा लगता है कि बिल्टिन प्रकार का कन्स्ट्रक्टर सुपर क्लास कन्स्ट्रक्टर को कॉल नहीं करता है। इसके परिणामस्वरूप __init__ विधियों को एमआरओ में बिल्टिन के बाद आने वाले प्रकारों के लिए बुलाया नहीं जा रहा है।पायथन 3 बिल्टिन प्रकार __init__ सुपर() .__ init__ को कॉल नहीं करता है?
उदाहरण:
class A:
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
print("A().__init__()")
class B(list, A):
def __init__(self, *args, **kwargs):
print("B().__init__() start")
super().__init__(*args, **kwargs)
print("B().__init__() end")
if __name__ == '__main__':
b = B()
इस नमूने में, एक .__ init__ कभी नहीं कहा जाता है। जब बी को class B(A, list)
के रूप में परिभाषित किया जाता है - विरासत आदेश को स्विच करना - यह इच्छित के रूप में कार्य करता है (यानी ए .__ init__ कहा जाता है)।
विरासत आदेश पर यह बहुत ही सूक्ष्म निर्भरता बल्कि गैर-पायथनिक लगता है, क्या इसका इरादा इस तरह से किया गया है? इसका मतलब यह भी है कि आपको कभी भी जटिल श्रेणी पदानुक्रमों में बिल्टिन प्रकारों से प्राप्त नहीं होना चाहिए, क्योंकि आप यह नहीं जान सकते कि एमआरओ में बिल्टिन कहां समाप्त होता है जब कोई और आपके वर्गों (रखरखाव डरावनी) से निकलता है। क्या मैं कुछ भूल रहा हूँ?
अतिरिक्त जानकारी: अजगर संस्करण 3,1
अजगर कभी नहीं सुपर क्लास की '__init__' तरीकों – Marcin
क्या इसके साथ init__'' एक .__ कहेंगे स्वचालित मंगलाचरण किया गया है? 'list .__ init__' एक तर्क लेता है, और अगर यह और भी हो जाता है तो एक त्रुटि फेंकता है। यहां तक कि अगर यह अन्य तर्कों को मनमाने ढंग से स्वीकार करता है, तो यह पहले व्यक्ति को बंद कर देगा, इसलिए ए देखा गया विरासत आदेश पर निर्भर करेगा। –
एक समान प्रश्न: http: // stackoverflow।कॉम/प्रश्न/3277367/कैसे-करता-पायथन-सुपर-वर्क-एकाधिक-विरासत के साथ Guido के उस प्रश्न के उत्तर से आने के साथ: http://python-history.blogspot.com/2010/06/method- रेज़ोल्यूशन-ऑर्डर.html – aganders3