इस कोड में ए को क्यों नहीं कहा जाता है: [क्या यह एमआरओ की वजह से है: बाएं से दाएं तो ए क्लास को कॉल किया जाना चाहिए?]

class A:
    
     def __init__(self,name):
        print('inside a',name)
        
class B:
    
     def __init__(self,name):
        print('inside b',name)
        
class C(B,A):
    
     def __init__(self,name):
        print('inside c',name)
        super().__init__(name)
        
c = C('hello')

आउटपुट:

inside c hello

inside b hello

लेकिन जब मैंने इसे मूल रूप से एक मूल वर्ग की तरह परिभाषित किया तो यह अपेक्षित रूप से ठीक से काम कर रहा है। [यहां एक वर्ग क्यों कहा जाता है] कोड:

class D:
    
    def __init__(self,name):
        print('inside d',name)
    
class A(D):
    
     def __init__(self,name):
        print('inside a',name)
        super().__init__(name)
        
class B(D):
    
     def __init__(self,name):
        print('inside b',name)
        super().__init__(name)
        
class C(B,A):
    
    def __init__(self,name):
        print('inside c',name)
        super().__init__(name)
        
c = C('hello')

आउटपुट:

inside c hello

inside b hello

inside a hello

inside d hello
0
Nitin Kothari 30 अगस्त 2020, 16:43

1 उत्तर

सबसे बढ़िया उत्तर

विधि समाधान आदेश के अनुसार, सदस्यों को पहली खोज पद्धति में गहराई से खोजा जाता है यानी आपके पहले उदाहरण में:

class A:
    
     def __init__(self,name):
        print('inside a',name)
class B:
    
     def __init__(self,name):
        print('inside b',name)       


class C(B,A):
    
     def __init__(self,name):
        print('inside c',name)
        super().__init__(name)
        
c = C('hello')

प्रथम: C के निर्माता को कहा जाता है।

दूसरा: चूंकि आपके पास कक्षा C में super().init(name) है, इसलिए यह अपने बाएं पैरेंट यानी B को कॉल करेगा।

तीसरा: यह दाईं ओर जाने की कोशिश करेगा (कक्षा सी) लेकिन चूंकि आपने सुपर () नहीं लिखा है। init(नाम) कक्षा बी के अंदर, कक्षा ए के निर्माता कॉल नहीं किया जा सकता क्योंकि कक्षा बी से यह ऑब्जेक्ट क्लास में नहीं जा सकता है

                            Object
                             /\
                            /  \
                           B    A
                            \  /
                             \/
                             C 

यदि आप कक्षा B में super().init(name) लिखेंगे, तो यह ऑब्जेक्ट क्लास से ऑब्जेक्ट के दाईं ओर यानी क्लास A में पुनरावृत्त होगा

उदाहरण के लिए:

class A:
    
     def __init__(self,name):
        print('inside a',name)
        
class B:

     def __init__(self,name):
        print('inside b',name)
        super().__init__(name)

        
class C(B,A):
    
     def __init__(self,name):
        print('inside c',name)
        super().__init__(name)

        
c = C('hello')

अधिक जानकारी के लिए :https://www.geeksforgeeks.org/method -संकल्प-क्रम-में-पायथन-विरासत/

2
Vishal Yadav 31 अगस्त 2020, 12:48