[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