मेरे पास साइबोर्ग नामक एक वर्ग है और यह अन्य दो वर्गों से विरासत में मिला है: मानव और रोबोट। मान लें कि दोनों माता-पिता की अपनी-अपनी विधि है Talk(), क्या मैं साइबोर्ग बच्चे से इन दो विधियों को कॉल कर सकता हूं? उदाहरण के लिए:

class Cyborg(Human, Robot):
    def Talk(self):
        human_properties = Human.Talk()
        robot_properties = Robot.Talk()
        return human_properties + robot_properties

सुपर () विधि उस समस्या का समाधान नहीं करती है।

1
user5533613 2 अप्रैल 2018, 23:03

3 जवाब

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

super() का उपयोग करके आप MRO श्रृंखला में एक ही नाम की पहली विधि को चुनेंगे, लेकिन दोनों को नहीं (जब तक कि पिक अप विधि अपने आप super() को कॉल नहीं करती)। यदि आप उन दोनों को चुनना चाहते हैं तो आपको उन्हें मैन्युअल रूप से कॉल करना होगा और स्पष्ट रूप से self संदर्भ पास करना होगा:

class Cyborg(Human, Robot):
    def Talk(self):
        human_properties = Human.Talk(self)
        robot_properties = Robot.Talk(self)
        return human_properties + robot_properties

मैं वैसे भी कई विरासत के खिलाफ सलाह दूंगा - निफ्टी और उपयोगी होने पर, और बहुत ही दुर्लभ मामलों में अपरिवर्तनीय, यह इतने सारे नुकसान के साथ आता है कि इससे निपटना इसके लायक नहीं है ...

1
zwer 2 अप्रैल 2018, 20:10

Talk को एक विधि के रूप में मानने के बजाय, इसे classmethod के रूप में लागू करें, इस प्रकार पहली जगह में इनहेरिट करने की आवश्यकता समाप्त हो जाती है:

class Human:
   @classmethod
   def Talk(cls, *args):
      return 

class Robot:
  @classmethod
   def Talk(cls, *args):
      return

class Cyborg:
  def Talk(self):
     return Human.Talk() + Robot.Talk()
0
Ajax1234 2 अप्रैल 2018, 20:14

यदि आप अपने वंशानुक्रम ग्राफ को सही ढंग से लागू करते हैं, तो यह super के साथ किया जा सकता है। इसके लिए काम करने के लिए, Human और Robot दोनों को एक सामान्य आधार वर्ग की आवश्यकता है जो Talk कर सके।

class Thing:
    def Talk(self):
        # Things don't talk, but some more complex things may
        return ''

class Robot(Thing):
    def Talk(self):
        return 'I am a computer!\n' + super().Talk()

class Human(Thing):
    def Talk(self):
        return 'I am an organic being!\n' + super().Talk()

class Cyborg(Human, Robot):
    def Talk(self):
        return super().Talk()

यहाँ एक बात कर रहे उदाहरण है।

>>> Cyborg().Talk()
I am an organic being!
I am a computer!

>>> Robot().Talk()
I am a computer!

>>> Human().Talk()
I am an organic being!
3
Olivier Melançon 2 अप्रैल 2018, 23:45