मुख्य सामग्री पर जाएं
मॉड्यूल 7 · पाठ 2 का 4पाठ्यक्रम में 26/36~12 min
मॉड्यूल पाठ (2/4)

विरासत

विरासत आपको एक नया वर्ग (उपवर्ग) बनाने की सुविधा देता है किसी मौजूदा वर्ग (आधार वर्ग) से विशेषताएँ और विधियाँ प्राप्त होती हैं, और उन्हें बढ़ा या ओवरराइड कर सकता है.

मूल वाक्यविन्यास

Python
class Animale:
    def __init__(self, nome):
        self.nome = nome

    def saluta(self):
        return f"{self.nome} fa un verso"

class Cane(Animale):       # Cane EREDITA da Animale
    def saluta(self):       # OVERRIDE del metodo
        return f"{self.nome} dice WOOF!"

a = Animale("X")
c = Cane("Fido")
a.saluta()      # 'X fa un verso'
c.saluta()      # 'Fido dice WOOF!'

Cane को Animale को बिना दोबारा लिखे Animale से विरासत में मिला है।

super(): आधार विधि को कॉल करना

जब आप किसी आधार विधि को विस्तारित करना चाहते हैं (इसे पूरी तरह से प्रतिस्थापित नहीं करना चाहते हैं), तो इसका उपयोग करें super():

Python
class Animale:
    def __init__(self, nome):
        self.nome = nome

class Cane(Animale):
    def __init__(self, nome, razza):
        super().__init__(nome)    # delega alla base
        self.razza = razza

c = Cane("Fido", "Labrador")
c.nome        # 'Fido'
c.razza       # 'Labrador'

isinstance: चेक टाइप करें

Python
isinstance(c, Cane)        # True
isinstance(c, Animale)     # True (anche la base)
isinstance(c, str)         # False

isinstance(x, BaseClass) सभी उपवर्गों को भी पहचानता है: यही है बहुरूपता के लिए वंशानुक्रम को उपयोगी बनाता है।

Python
animali = [Cane("Fido", "X"), Animale("Pippo")]
for a in animali:
    print(a.saluta())        # ogni oggetto risponde a suo modo

एमआरओ (विधि समाधान आदेश) - सिंहावलोकन

जब आपके पास एकाधिक वंशानुक्रम होता है, तो पायथन तय करता है कि किस क्रम में देखना है MRO का पालन करके एक विधि के लिए, C3 एल्गोरिथम के साथ गणना की जाती है। के लिए 95% मामलों में यह जानना पर्याप्त है:

  1. यह उदाहरण में सबसे पहले दिखता है,
  2. फिर अपनी कक्षा में,
  3. फिर घोषणा क्रम में आधार वर्गों में।
Python
Cane.__mro__
# (<class 'Cane'>, <class 'Animale'>, <class 'object'>)

object Python 3 में प्रत्येक वर्ग का मूल है।

आपकी बारी

व्यायाम#python.m7.l2.e1
प्रयास: 0लोड हो रहा है...

दिया गया `क्लास वाहन: def __init__(self, ब्रांड): self.brand = ब्रांड`, `Car(Vehicle)` को __init__(self, ब्रांड, मॉडल) के साथ परिभाषित करें जो super().__init__ को कॉल करता है और self.model को स्टोर करता है। `a = Car('Fiat', '500')` बनाएं और `(a.brand, a.model)` का मूल्यांकन करें।

संपादक लोड हो रहा है...
संकेत दिखाएँ

super().__init__(brand) फिर self.model = model.

3 प्रयासों के बाद समाधान उपलब्ध है

व्यायाम की समीक्षा करें

व्यायाम#python.m7.l2.e2
प्रयास: 0लोड हो रहा है...

`वर्ग आकार: परिभाषित क्षेत्र(स्वयं): वापसी 0` और `वर्ग वर्ग(आकार)` को __init__(स्वयं, पक्ष) और क्षेत्र() के साथ परिभाषित करें जो पक्ष * पक्ष लौटाता है। `q = स्क्वायर(5)` बनाएं और टुपल `(q.area(), isinstance(q, आकार))` का मूल्यांकन करें।

संपादक लोड हो रहा है...
संकेत दिखाएँ

स्व.पक्ष * स्व.पक्ष.

3 प्रयासों के बाद समाधान उपलब्ध है

अतिरिक्त चुनौती

व्यायाम#python.m7.l2.e3
प्रयास: 0लोड हो रहा है...

Create a class `Square` that inherits from the `Rectangle` class (defined below). The constructor of `Square` must take a single parameter `side` and pass it to `super().__init__(side, side)`. Instantiate a square with side `6` in `sq` and evaluate `sq.area()`.

संपादक लोड हो रहा है...
संकेत दिखाएँ

Declare class Square(Rectangle): and call super().__init__(side, side) in the constructor.

3 प्रयासों के बाद समाधान उपलब्ध है