मॉड्यूल पाठ (2/4)
विरासत
विरासत आपको एक नया वर्ग (उपवर्ग) बनाने की सुविधा देता है किसी मौजूदा वर्ग (आधार वर्ग) से विशेषताएँ और विधियाँ प्राप्त होती हैं, और उन्हें बढ़ा या ओवरराइड कर सकता है.
मूल वाक्यविन्यास
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():
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: चेक टाइप करें
isinstance(c, Cane) # True
isinstance(c, Animale) # True (anche la base)
isinstance(c, str) # Falseisinstance(x, BaseClass) सभी उपवर्गों को भी पहचानता है: यही है
बहुरूपता के लिए वंशानुक्रम को उपयोगी बनाता है।
animali = [Cane("Fido", "X"), Animale("Pippo")]
for a in animali:
print(a.saluta()) # ogni oggetto risponde a suo modoएमआरओ (विधि समाधान आदेश) - सिंहावलोकन
जब आपके पास एकाधिक वंशानुक्रम होता है, तो पायथन तय करता है कि किस क्रम में देखना है MRO का पालन करके एक विधि के लिए, C3 एल्गोरिथम के साथ गणना की जाती है। के लिए 95% मामलों में यह जानना पर्याप्त है:
- यह उदाहरण में सबसे पहले दिखता है,
- फिर अपनी कक्षा में,
- फिर घोषणा क्रम में आधार वर्गों में।
Cane.__mro__
# (<class 'Cane'>, <class 'Animale'>, <class 'object'>)object Python 3 में प्रत्येक वर्ग का मूल है।
आपकी बारी
दिया गया `क्लास वाहन: 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 प्रयासों के बाद समाधान उपलब्ध है
व्यायाम की समीक्षा करें
`वर्ग आकार: परिभाषित क्षेत्र(स्वयं): वापसी 0` और `वर्ग वर्ग(आकार)` को __init__(स्वयं, पक्ष) और क्षेत्र() के साथ परिभाषित करें जो पक्ष * पक्ष लौटाता है। `q = स्क्वायर(5)` बनाएं और टुपल `(q.area(), isinstance(q, आकार))` का मूल्यांकन करें।
संकेत दिखाएँ
स्व.पक्ष * स्व.पक्ष.
3 प्रयासों के बाद समाधान उपलब्ध है
अतिरिक्त चुनौती
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 प्रयासों के बाद समाधान उपलब्ध है