====== Oggetti e attributi ====== >> indice: [[appunti3s:linguaggio_python]] ===== Cosa faremo? ===== Riprendiamo l'esempio della costruzione di una finestra usando la classe Tkinter.Tk per parlare del contenuto degli oggetti. ===== Prerequisiti ===== Concetto di oggetto istanza, classe e metodo I metodi di solito consentono al programmatore di eseguire delle azioni sugli oggetti. Vediamo in questo esempio il metodo title() import Tkinter root = Tkinter.Tk() root.title(“il mio programma”) root.mainloop() Questo metodo imposta il titolo della finestra, memorizzandolo in una variabile/oggetto interna all'oggetto "root". In effetti tutti gli oggetti al loro interno sono costituiti da altri oggetti o da semplici variabili e questi elementi sono chiamati //attributi// dell'oggetto. Il programmatore non ha quasi mai la possibilità di modificare direttamente queste variabili, per esempio tramite un'assegnazione, ma deve usare i metodi predisposti per fare questo tipo di operazioni. Secondo la programmazione orientata agli oggetti, gli attributi "dato" delle classi e delle istanze devono essere difficili da modificare direttamente dal programmatore, ma solo tramite degli appositi attributi "metodi". I metodi possono essere divisi in due categorie: * metodi ispettori * metodi manipolatori * I primi sono usati per vedere il dato senza modificarlo. * I secondi sono usati per modificare il dato (senza vederlo). Questo modo di scrivere il programma può sembrare difficile e innaturale, ma permette di avere dei vantaggi nella manutenzione del programma. ====Attributi pubblici e privati==== Per rendere difficile modificare un attributo "dato", di solito lo si rende "privato". In altre parole si deve limitare la sua possibilità di accesso da parte del programma. Viceversa i dati che non sono privati, sono detti pubblici, cioè chiunque vi può accedere da qualsiasi punto del programma. In Python per rendere pubblico o privato qualcosa, basta usare una convenzione sul nome: * %%__esempio1%% * è la convenzione da usare per un elemento privato * esempio2 * è la convenzione da usare per un elemento pubblico * %%__esempio3__%% * è la convenzione da usare per un elemento built-in (pubblico), una convenzione che il programmatore non dovrebbe mai adottare Nel caso in cui si tenti di invocare un metodo privato, si ottiene un errore poco chiaro: AttributeError: 'Classe' instance has no attribute '__esempio1'