'''
ARGOMENTI:
---------------------------------------------------------------------

	ereditarieta'
		Capacita' di definire una nuova classe come versione modificata 
		di una classe gia' esistente, cioe' si possono aggiungere nuovi
		"attributi di classe" ed aggiungere/modificare metodi della classe "parent"
		
		In sostanza la nuova classe (child) "eredita" tutti i metodi e gli
		attributi della classe originaria (parent)
		
		L'ereditarieta' puo' essere:
			- singola: la classe deriva da una sola classe
			- multipla: la classe deriva da piu' classi (non trattata in questo esempio)
		
		NOTE:	
			1) Spesso rende piu' difficile la lettura del programma. 
			2) Molte delle cose che possono essere trattate con l'ereditarieta' 
			   possono essere di solito gestite senza di essa. 
			3) Usata nel momento sbagliato puo' arrecare piu' danni che benefici.
			
'''


class Persona:
	def __init__(self, no, co, an):
		self.nome = no
		self.cognome = co
		self.annoNascita  = an 
	def visualizza(self):
		print ("\n")
		print (" >>> PERSONA -", self.cognome, self.nome,
                       "- Anno di nascita:", self.annoNascita,
                       end="") # "end" ridefinisce il "carattere" di fine riga
 

  
# In Python la notazione e' diversa rispetto ad altri linguaggi.
# Non si usano "parole chiave" tipo "extends", ma si impsta
# come se fosse un parametro di una funzione.  
class Insegnante(Persona):
	# I parametri possono avere nome diversi da quelli della classe "parent",
	# ma devono essere gli stessi in __init__ e nella chiamata alla classe "parent"
    def __init__(self, nome, cogn, anno, di):
        Persona.__init__(self, nome, cogn, anno )
        self.disciplina=di
    def visualizza(self):
	# Viene utilizzata una parte del metodo "parent", ma potrei anche
	# modificarlo completamente: esempio successivo
        Persona.visualizza(self)
        print (" - Disciplina:", self.disciplina, "- Tipo: INSEGNANTE")



class Alunno(Persona):
    def __init__(self, nome, cogn, anno, me):
        Persona.__init__(self, nome, cogn, anno)
        self.mediaVoti=me
        
    def visualizza(self):
        # Modificato rispetto al metodo "visualizza" della classe "parent" 
        print ("\n")
        print(" >>> ALUNNO -------------------------------------")
        print(" Cognome\t:", self.cognome)
        print(" Nome\t\t:", self.nome)
        print(" Anno di nascita:", self.annoNascita)
        print(" Media voti\t:", self.mediaVoti)
       
    # Le 5 righe successive hanno presentato strani problemi di indentazione
    def rendimento(self):
        if self.mediaVoti<6:
                print(self.cognome, self.nome, ">>> rendimento negativo")
        else:
                print(self.cognome, self.nome, ">>> rendimento positivo")
                



       


	
p1=Persona("Charles", "BUKOWSKI", 1920)
p2=Persona("Frantz", "KAFKA", 1883)
p1.visualizza()
p2.visualizza()

i1= Insegnante("Albert", "EINSTEIN", 1879, "Fisica")
i2= Insegnante("Nikola", "TESLA", 1853, "Elettrotecnica")
i1.visualizza()
i2.visualizza()

a1= Alunno("Quentin", "TARANTINO", 1963, 4)
a2= Alunno("Sergio", "LEONE", 1929, 7)
a1.visualizza()
a2.visualizza()

print("\n")
a1.rendimento()
a2.rendimento()



