python - पायथन में चेन कॉलिंग पेरेंट कन्स्ट्रक्टर




oop inheritance (2)

इस प्रश्न का उत्तर यहां दिया गया है:

इस पर विचार करें - एक बेस क्लास ए, क्लास बी ए से उत्तराधिकारी, बी से उत्तराधिकारी बी। कन्स्ट्रक्टर में अभिभावक वर्ग कन्स्ट्रक्टर को कॉल करने का एक सामान्य तरीका क्या है? अगर यह अभी भी अस्पष्ट लगता है, तो यहां कुछ कोड है।

class A(object):
    def __init__(self):
        print "Constructor A was called"

class B(A):
    def __init__(self):
        super(B,self).__init__()
        print "Constructor B was called"

class C(B):
    def __init__(self):
        super(C,self).__init__()
        print "Constructor C was called"

c = C()

इस तरह मैं इसे अब करता हूं। लेकिन यह अभी भी थोड़ा गैर-जेनेरिक लगता है - आपको अभी भी एक सही प्रकार से हाथ से गुजरना होगा।

अब, मैंने सुपर ( self.__class__ ) को सुपर () के पहले तर्क के रूप में self.__class__ का उपयोग करने का प्रयास किया है, लेकिन जाहिर है, यह काम नहीं करता है - अगर आप इसे सी-मेले के लिए कन्स्ट्रक्टर में रखते हैं, तो बी के कन्स्ट्रक्टर को बुलाया जाता है। यदि आप बी में ऐसा करते हैं, तो "स्वयं" अभी भी सी के उदाहरण को इंगित करता है ताकि आप फिर से बी के कन्स्ट्रक्टर को कॉल कर सकें (यह एक अनंत रिकर्सन में समाप्त होता है)।

अब के लिए हीरा विरासत के बारे में सोचने की कोई आवश्यकता नहीं है, मुझे इस विशिष्ट समस्या को हल करने में दिलचस्पी है।


आप बस लिख सकते हैं:

class A(object):

    def __init__(self):
        print "Constructor A was called"

class B(A):

    def __init__(self):
        A.__init__(self)
        # A.__init__(self,<parameters>) if you want to call with parameters
        print "Constructor B was called"

class C(B):

    def __init__(self):
        # A.__init__(self) # if you want to call most super class...
        B.__init__(self)
        print "Constructor C was called"

जिस तरह से आप इसे कर रहे हैं वह वास्तव में अनुशंसित है (पायथन 2.x के लिए)।

कक्षा को स्पष्ट रूप से पारित किया गया है या नहीं, यह मुद्दा कार्यक्षमता की बजाय शैली का मामला है। पाइथन के दर्शन के साथ "स्पष्ट से स्पष्ट स्पष्ट" के साथ कक्षा में super फिट बैठता है।





constructor