[Python] Ereditarietà tra classi: un semplice esempio pratico da chiarire
Marco Ippolito
ippolito.marco a gmail.com
Ven 21 Nov 2014 18:19:29 CET
Ciao a tutti,
con l'obiettivo di capire fino in fondo alcuni aspetti
dell'ereditarietà tra classi che non mi sono ancora chiari (pensavo lo
fossero), mi sono scritto un esempio forzatamente banale.
#!/usr/bin/python
class Super:
def __init__(self, nome, cognome, citta):
self.nome = nome
self.cognome = cognome
self.citta = citta
self.nome_intero = '%s %s' % (self.nome, self.cognome)
def super_meth_1(self):
return '%s abita a %s' % (self.nome_intero, self.citta)
def get_super_result(self):
return self.super_meth_1()
class Sub(Super):
def __init__(self, indirizzo,cosa_fa):
Super.__init__(self, nome, cognome, indirizzo)
self.cosa_fa = cosa_fa
def sub_meth_1(self):
return '%s %s' % (self.nome_intero, self.cosa_fa)
def get_sub_meth_1(self):
return self.sub_meth_1()
if __name__ == '__main__':
nome = 'Marco'
cognome = 'Ippolito'
abita = 'Milano'
super_class = Super(nome, cognome, abita)
ris_super = super_class.get_super_result()
print 'ris_super: ', ris_super
cosa = 'suona'
sub = Sub(abita, cosa)
ris_sub_1 = sub.get_sub_meth_1()
print "ris_sub_1: ", ris_sub_1
ris_sub_2 = sub.get_super_result()
print "ris_sub_2: ", ris_sub_2
time ./classInheritage2.py
ris_super: Marco Ippolito abita a Milano
ris_sub_1: Marco Ippolito suona
ris_sub_2: Marco Ippolito abita a Milano
ora...
se modifico la Sub class in questo modo:
#!/usr/bin/python
class Super:
def __init__(self, nome, cognome, citta):
self.nome = nome
self.cognome = cognome
self.citta = citta
self.nome_intero = '%s %s' % (self.nome, self.cognome)
def super_meth_1(self):
return '%s abita a %s' % (self.nome_intero, self.citta)
def get_super_result(self):
return self.super_meth_1()
class Sub(Super):
def __init__(self, cosa_fa):
Super.__init__(self, nome, cognome, citta)
self.cosa_fa = cosa_fa
def sub_meth_1(self):
return '%s %s' % (self.nome_intero, self.cosa_fa)
def get_sub_meth_1(self):
return self.sub_meth_1()
if __name__ == '__main__':
nome = 'Marco'
cognome = 'Ippolito'
abita = 'Milano'
super_class = Super(nome, cognome, abita)
ris_super = super_class.get_super_result()
print 'ris_super: ', ris_super
cosa = 'suona'
sub = Sub(cosa)
ris_sub_1 = sub.get_sub_meth_1()
print "ris_sub_1: ", ris_sub_1
ris_sub_2 = sub.get_super_result()
print "ris_sub_2: ", ris_sub_2
l'ouput risulta:
ris_super: Marco Ippolito abita a Milano
Traceback (most recent call last):
File "./classInheritage3.py", line 37, in <module>
sub = Sub(cosa)
File "./classInheritage3.py", line 18, in __init__
Super.__init__(self, nome, cognome, citta)
NameError: global name 'citta' is not defined
Cosa differenzia l'attributo "citta" dagli altri attributi ("nome" e
"cognome") anche essi presenti in Super class?
Qual è il modo corretto per far ś che Sub class erediti da Super
class gli attributi "nome, "cognome" e "citta" ?
Marco
Maggiori informazioni sulla lista
Python