Modül dersleri (2/4)
Miras
Kalıtım, yeni bir sınıf (alt sınıf) oluşturmanıza olanak tanır. mevcut bir sınıftan (temel sınıf) nitelikleri ve yöntemleri devralır, ve bunları genişletebilir veya geçersiz kılabilir.
Temel sözdizimi
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, __init__ öğesini yeniden yazmadan Animale öğesinden devralır.
super(): temel yöntemin çağrılması
Bir temel yöntemi genişletmek istediğinizde (tamamen değiştirmek değil), şunu kullanın:
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: tür kontrolü
isinstance(c, Cane) # True
isinstance(c, Animale) # True (anche la base)
isinstance(c, str) # Falseisinstance(x, BaseClass) aynı zamanda tüm alt sınıfları da tanır: işte bu
kalıtımı polimorfizm için yararlı kılar.
animali = [Cane("Fido", "X"), Animale("Pippo")]
for a in animali:
print(a.saluta()) # ogni oggetto risponde a suo modoMRO (Yöntem Çözüm Sırası) — genel bakış
Çoklu mirasınız olduğunda Python hangi sıraya bakılacağına karar verir C3 algoritmasıyla hesaplanan MRO'yu takip ederek bir yöntem için. için Vakaların %95'inde şunu bilmek yeterlidir:
- örnekte ilk önce o görünür,
- daha sonra kendi sınıfında,
- Daha sonra temel sınıflarda bildirim sırasına göre.
Cane.__mro__
# (<class 'Cane'>, <class 'Animale'>, <class 'object'>)object Python 3'teki her sınıfın köküdür.
Sıra sende
Verilen 'Araç sınıfı: def __init__(self, brand): self.brand = brand', 'Car(Vehicle)'ı super().__init__ çağıran ve self.model'i saklayan __init__(self, brand, model) ile tanımlayın. `a = Car('Fiat', '500')` oluşturun ve `(a.brand, a.model)`'i değerlendirin.
İpucu göster
super().__init__(brand) sonra self.model = model.
3 denemeden sonra çözüm mevcut
Alıştırmayı gözden geçirin
'class Shape: def field(self): return 0' ve 'class Square(Shape)'i __init__(self, side) ve side * side döndüren field() ile tanımlayın. `q = Square(5)` oluşturun ve `(q.area(), isinstance(q, Shape))` tuple'ını değerlendirin.
İpucu göster
öz.taraf * öz.taraf.
3 denemeden sonra çözüm mevcut
Ek zorluk
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()`.
İpucu göster
Declare class Square(Rectangle): and call super().__init__(side, side) in the constructor.
3 denemeden sonra çözüm mevcut