Moștenirea în Python
Prin moștenire, o clasă poate prelua toate metodele și proprietățile altei clase.
Clasa care le oferă este clasa părinte, numită uneori clasă de bază.
Clasa care le primește este clasa copil, cunoscută și ca clasă derivată.
Crearea unei clase părinte
O clasă părinte nu are nevoie de o sintaxă specială. O scrii ca pe orice altă clasă, iar orice clasă poate avea acest rol:
Exemplu
Person stochează proprietățile firstname și lastname și oferă o metodă printname:
Ieșire: program Python complet
class Person:
def __init__(self, fname, lname):
self.firstname = fname
self.lastname = lname
def printname(self):
print(self.firstname, self.lastname)
#Folosește clasa Person pentru a crea un obiect, apoi execută metoda printname:
x = Person("John", "Doe")
x.printname()
Crearea unei clase copil
Ca să creezi o clasă copil, scrie numele părintelui între paranteze după numele noii clase, astfel încât funcționalitatea să fie preluată:
Notă: pass este ceea ce scrii atunci când clasa nu are nevoie de nimic propriu în afară de ce moștenește.
Drept rezultat, Student ajunge să aibă toate proprietățile și metodele pe care le are Person.
Exemplu
Student își ia proprietățile și metodele de la clasa Person:
Ieșire: program Python complet
class Person:
def __init__(self, fname, lname):
self.firstname = fname
self.lastname = lname
def printname(self):
print(self.firstname, self.lastname)
class Student(Person):
pass
x = Student("Mike", "Olsen")
x.printname()
class Student(Person):
pass
Adăugarea funcției __init__()
Clasa noastră copil primește deocamdată pur și simplu totul de la părintele ei.
În continuare, înlocuiește cuvântul cheie pass cu o funcție __init__() proprie.
Notă: Python apelează singur __init__() de fiecare dată când clasa creează un obiect nou.
Există însă o capcană: o clasă copil cu propria __init__() nu mai moștenește versiunea părintelui.
Notă: Funcția __init__() a copilului o suprascrie pe cea pe care ar fi moștenit-o de la părinte.
Ca să recapeți comportamentul părintelui, apelează funcția __init__() a părintelui din interiorul celei a copilului:
Copilul are acum propria __init__() și păstrează în continuare ce oferă părintele, așa că este gata să-i adaugi funcționalitate nouă.
Exemplu
Ieșire: program Python complet
class Person:
def __init__(self, fname, lname):
self.firstname = fname
self.lastname = lname
def printname(self):
print(self.firstname, self.lastname)
class Student(Person):
def __init__(self, fname, lname):
Person.__init__(self, fname, lname)
class Student(Person):
def __init__(self, fname, lname):
#add properties etc.
Folosirea funcției super()
Funcția încorporată super() este o altă cale de a ajunge la părinte dintr-o clasă copil:
Deoarece super() găsește părintele în locul tău, numele părintelui nu trebuie să apară niciodată în apel și tot ai acces la metodele și proprietățile lui.
Exemplu
Ieșire: program Python complet
class Person:
def __init__(self, fname, lname):
self.firstname = fname
self.lastname = lname
def printname(self):
print(self.firstname, self.lastname)
class Student(Person):
def __init__(self, fname, lname):
super().__init__(fname, lname)
Adăugarea proprietăților
Un an de absolvire precum 2019 nu ar trebui scris direct în clasă. Ar trebui să fie o variabilă, transmisă clasei Student de fiecare dată când este creat un obiect student, iar pentru asta este nevoie de încă un parametru în __init__():
Exemplu
Adaugă un parametru year și furnizează valoarea potrivită la crearea fiecărui obiect:
Ieșire: program Python complet
class Person:
def __init__(self, fname, lname):
self.firstname = fname
self.lastname = lname
def printname(self):
print(self.firstname, self.lastname)
class Student(Person):
def __init__(self, fname, lname, year):
super().__init__(fname, lname)
self.graduationyear = year
x = Student("Mike", "Olsen", 2019)
Adăugarea metodelor
Clasele copil pot avea metode proprii. Un lucru la care trebuie să fii atent: o metodă din clasa copil care are același nume ca o funcție din clasa părinte o suprascrie pe cea moștenită.
Exemplu
Dă clasei Student o metodă welcome:
Ieșire: program Python complet
class Person:
def __init__(self, fname, lname):
self.firstname = fname
self.lastname = lname
def printname(self):
print(self.firstname, self.lastname)
class Student(Person):
def __init__(self, fname, lname, year):
super().__init__(fname, lname)
self.graduationyear = year
def welcome(self):
print("Bun venit,", self.firstname, self.lastname, "în promoția", self.graduationyear)