SlideShare a Scribd company logo
1 of 19
Download to read offline
Parte 2




      Programmazione ad oggetti
             in Python




Linguaggi dinamici – A.A. 2009/2010
                                      1
Introduzione
„   Unità fondamentale degli oggetti: classe
      „   Contenitore di variabili (attributi) e funzioni
          (metodi)
„   Strumenti a di
    St     ti disposizione della OOP
                    i i    d ll
      „   Astrazione: capacità di ridurre il numero di
          dettagli implementativi
          d     li i l         i i
      „   Incapsulamento: capacità di nascondere i
          dettagli ai moduli esterni
      „   Ereditarietà: capacità di perfezionare il
          comportamento di una classe
      „   Polimorfismo: capacità di adattare il
          comportamento in funzione di ingressi e uscita
Linguaggi dinamici – A.A. 2009/2010
                                                            2
Definizione di classe in Python
„   Una classe è definita all'interno di un modulo,
    tramite lo statement class
class ClassName:
   <statement 1>
   < t t     t
   …
   <statement n>
„ Solitamente, gli statement sono definizioni di
  funzioni (ma non è necessariamente detto)
„ La definizione di una classe crea un nuovo
  namespace, che viene usato come lo scope della
  classe (variabili locali)

Linguaggi dinamici – A.A. 2009/2010
                                                      3
Oggetti “classe”
„   Al termine della definizione di una classe,
    l interprete
    l'interprete crea un oggetto di tipo classe
„   Tale oggetto abilita due operazioni:
      „   Attribute f
          Att ib t reference: permette l'
                                      tt l'accesso aglili
          elementi di una classe (attributi e metodi),
          tramite la sintassi NomeClasse nome elemento
                              NomeClasse.nome_elemento
      „   Instantiation: permette la creazione di istanze di
          classe (oggetti) tramite la notazione funzionale
          variabile = NomeClasse()
„   L'istanziazione si preoccupa di invocare il
    L'i t   i i      i              i
    metodo costruttore della classe

Linguaggi dinamici – A.A. 2009/2010
                                                               4
Creazione di un oggetto
„   Un oggetto viene creato “chiamando” la classe
     „   o = MyClass()
„   Alla variabile o viene assegnato un riferimento
    ad un oggetto di classe MyClass
„   Ricordarsi di importare il nome della classe se
    è definito in un namespace diverso
„   Ad es., se MyClass è definita nel file
    MyClass.py
    M Cl
     „   from MyClass import MyClass


               namespace
                    p                 classe

Linguaggi dinamici – A.A. 2009/2010
                                                      5
ÆESEMPI

                      Il metodo costruttore
                                                      Bag.py
                                                   Complex.py


„   Il metodo costruttore di una classe ha il nome
    __init__, e viene invocato automaticamente in
       init
    seguito all'istanziazione di una classe
„   Il metodo __init__, per il resto, gode di tutte le
                  init         resto
    proprietà delle funzioni
      „   Argomenti con nome
          A      ti
      „   Argomenti di default
„   C’è sempre un argomento implicito che
    rappresenta l’oggetto
„   Lo stato interno di un oggetto è dichiarato
    tramite opportune strutture dati
             pp
Linguaggi dinamici – A.A. 2009/2010
                                                            6
ÆESEMPI

                             Attributi di dati
                                                       Complex2.py



„ Il Python permette la creazione automatica di
  attributi all interno di un oggetto, tramite
            all'interno       oggetto
  semplici operazioni di assegnazione
„ Ad esempio, posso creare un attributo counter
      esempio
  al volo su un oggetto x:
x.counter = 1
        t
„ counter viene trattato alla stregua di una

  variabile di appoggio, valida solo per l'istanza
  x
      „   Quando x viene distrutto, counter sparisce
      „   counter può essere distrutto con del
                  p
Linguaggi dinamici – A.A. 2009/2010
                                                                 7
Metodi
„  È possibile invocare i metodi di un oggetto o di
   una classe con la notazione .
risultato = oggetto.metodo(argomenti)
„ Il primo argomento di ogni metodo, che viene
       i            t        i   t d    h i
   passato implicitamente dall'interprete, è
      „   la reference all'oggetto istanza, se il metodo è
          stato invocato tramite un'istanza
      „   la reference all'oggetto classe, se il metodo è
          stato invocato tramite la classe
„   Per convenzione, il primo argomento viene
    nominato self
Linguaggi dinamici – A.A. 2009/2010
                                                             8
Metodi
„   Si noti che la chiamata
     „   x = MyClass()
     „   x.m()
„   corrisponde a:
        i    d
     „   MyClass.m(x)
„   E in effetti il metodo è definito così:
     „   class MyClass:
         „  def m(self):
         „  …



Linguaggi dinamici – A.A. 2009/2010
                                               9
ÆESEMPI

                                      Metodi
                                                   C.py



„   È anche possibile sfruttare funzioni definite
    fuori dalla classe
„   Attraverso una variabile della classe che
    rappresenta la funzione esterna
„   È valido anche per metodi definiti internamente
    alla classe




Linguaggi dinamici – A.A. 2009/2010
                                                      10
Distruttori
„   In maniera simile al Perl, è previsto un
    meccanismo di reference counting degli
    oggetti
„   Si invoca la procedura di distruzione quando:
      „   il reference count di un oggetto diventa nullo
      „   si invoca il metodo del() sull'oggetto
            ii             d d l() ll'
„   Procedura di distruzione: l'interprete invoca il
    metodo privato __del__() dell'oggetto (che sia
    definito nell'oggetto stesso o ereditato da una
    superclasse)


Linguaggi dinamici – A.A. 2009/2010
                                                           11
ÆESEMPI

                                 Ereditarietà
                                                Ereditarieta.py



„   Una classe può ereditare da un'altra classe
    con la seguente sintassi:
class DerivedClassName(BaseClassName):
  <statement 1>
  < t t     t
  …
  <statement n>
„   È possibile usare il nome completo della
      p                            p
    superclasse (comodo nelle situazioni in cui la
    superclasse è definita in un altro file)
       p                                   )
„   Altrimenti ricordarsi di importare la classe dal
    modulo
Linguaggi dinamici – A.A. 2009/2010
                                                            12
Ereditarietà multipla
„   Una classe può ereditare da più classi con la
    seguente sintassi:
class DerivedClassName(C1, C2, C3):
   <statement 1>
   < t t    t
   …
   <statement n>
„   È possibile usare il nome completo delle
        p                           p
    superclassi
 „ La ricerca di un elemento non in C avviene per

    profondità prima in C1 (e superclassi), poi in
    C2 (e superclassi), e infine in C3 (e
    superclassi)
Linguaggi dinamici – A.A. 2009/2010
                                                     13
Funzioni relative all’ereditarietà
„   Il Python definisce due funzioni nel contesto
    dell ereditarietà
    dell'ereditarietà
     „ isinstance(obj, objtype): ritorna True se obj

       è un'istanza della classe objtype
         un istanza
     „ issubclass(obj, objtype): ritorna True se obj

       è una sottoclasse di objtype
                tt l          bjt




Linguaggi dinamici – A.A. 2009/2010
                                                       14
Polimorfismo
„ È sufficiente ridefinire un metodo all'interno di
  una sottoclasse per sostituirlo alle definizioni
  presenti nelle superclassi
„ L'interprete Python gestisce il polimorfismo
  L interprete
  automaticamente, andandosi a cercare il
  metodo con la signature adatta
„ All'interno di un metodo ridefinito nella

  sottoclasse, è possibile invocare il metodo
     tt l              ibil i              t d
  della superclasse con la seguente sintassi:
BaseClassName.methodname(self, arguments)


Linguaggi dinamici – A.A. 2009/2010
                                                      15
ÆESEMPI

                            Variabili private
                                                  Private.py



„   Ogni identificatore (variabile, metodo) __ident_
    con almeno due underscore davanti ed al più
    un underscore dietro viene rinominato
    internamente in _c ass a e__ident, dove
      te a e te       classname de t, do e
    classname è il nome della classe corrente
    senza gli underscore iniziali
          g




Linguaggi dinamici – A.A. 2009/2010
                                                         16
Vecchio e nuovo stile della POO
„   Nel vecchio stile:
     „   Le classi sono oggetti
     „   La ricerca di attributi avviene con un algoritmo
         statico (depth-first left-to-right)
                 (depth-first,
„   Nel nuovo stile:
     „   Le l
         L classi sono ti i
                  i      tipi
     „   La ricerca di attributi avviene in modo dinamico
     „   La gerarchia ha una radice: object
„   Il nuovo stile gestisce meglio casi di eredità “a
    diamante”, in cui la stessa superclasse è
    raggiungibile tramite percorsi diversi

Linguaggi dinamici – A.A. 2009/2010
                                                            17
ÆESEMPI

                                      super
                                                    Counter.py
                                                   Counter2.py


„   In Python non c’è il concetto di super
     „   Mancanza dovuta anche alla presenza di
         ereditarietà multipla
„   Esiste però la funzione super(type object) che
                              super(type,
    restituisce il “super tipo” della classe corrente
„   Funziona solo con il nuovo stile di classi
„   È necessario che all’apice della gerarchia ci
    sia object




Linguaggi dinamici – A.A. 2009/2010
                                                           18
ÆESEMPI

                                      Iteratori
                                                        Reverse.py



„   Il metodo __iter__ definisce un iteratore per la
    classe corrente
     „ Tale oggetto deve contenere un metodo

       next()
„   Il metodo next definisce lo step di iterazione
      „   Seleziona un elemento diverso ad ogni
          invocazione
      „   Solleva una eccezione di tipo StopIteration
          quando tutti gli elementi sono stati selezionati



Linguaggi dinamici – A.A. 2009/2010
                                                               19

More Related Content

What's hot

Pe a3 perl-metaprogramming
Pe a3 perl-metaprogrammingPe a3 perl-metaprogramming
Pe a3 perl-metaprogrammingMajong DevJfu
 
Pe t2 perl-caratteristiche
Pe t2 perl-caratteristichePe t2 perl-caratteristiche
Pe t2 perl-caratteristicheMajong DevJfu
 
2011.02.19 Introducing F#
2011.02.19 Introducing F#2011.02.19 Introducing F#
2011.02.19 Introducing F#Marco Parenzan
 
Scala: come recuperare la programmazione funzionale e perché
Scala: come recuperare la programmazione funzionale e perchéScala: come recuperare la programmazione funzionale e perché
Scala: come recuperare la programmazione funzionale e perchéEdmondo Porcu
 
Corso Iphone in 48h
Corso Iphone in 48hCorso Iphone in 48h
Corso Iphone in 48hFLT.lab
 
MS_corso base iOS iPhone_partI
MS_corso base iOS iPhone_partIMS_corso base iOS iPhone_partI
MS_corso base iOS iPhone_partIMobileSchool
 
Python@Unina - Theory
Python@Unina - TheoryPython@Unina - Theory
Python@Unina - TheoryNaLUG
 
Programmazione funzionale e Stream in Java
Programmazione funzionale e Stream in JavaProgrammazione funzionale e Stream in Java
Programmazione funzionale e Stream in JavaCristina Attori
 
Corso Programmazione Java Base
Corso Programmazione Java BaseCorso Programmazione Java Base
Corso Programmazione Java BaseK-Tech Formazione
 
Spyppolare o non spyppolare
Spyppolare o non spyppolareSpyppolare o non spyppolare
Spyppolare o non spyppolarePyCon Italia
 
Corso pratico di C# - 2013
Corso pratico di C# - 2013Corso pratico di C# - 2013
Corso pratico di C# - 2013Matteo Valoriani
 

What's hot (20)

Pe t3 perl-moduli
Pe t3 perl-moduliPe t3 perl-moduli
Pe t3 perl-moduli
 
Pe a3 perl-metaprogramming
Pe a3 perl-metaprogrammingPe a3 perl-metaprogramming
Pe a3 perl-metaprogramming
 
2006 Py03 intermedio
2006 Py03 intermedio2006 Py03 intermedio
2006 Py03 intermedio
 
Pe t2 perl-caratteristiche
Pe t2 perl-caratteristichePe t2 perl-caratteristiche
Pe t2 perl-caratteristiche
 
Pe t4 perl-oggetti
Pe t4 perl-oggettiPe t4 perl-oggetti
Pe t4 perl-oggetti
 
Inferno Limbo Italian
Inferno Limbo ItalianInferno Limbo Italian
Inferno Limbo Italian
 
2011.02.19 Introducing F#
2011.02.19 Introducing F#2011.02.19 Introducing F#
2011.02.19 Introducing F#
 
2006 Py01 intro
2006 Py01 intro2006 Py01 intro
2006 Py01 intro
 
Pe t1 perl-intro
Pe t1 perl-introPe t1 perl-intro
Pe t1 perl-intro
 
Scala: come recuperare la programmazione funzionale e perché
Scala: come recuperare la programmazione funzionale e perchéScala: come recuperare la programmazione funzionale e perché
Scala: come recuperare la programmazione funzionale e perché
 
Corso Iphone in 48h
Corso Iphone in 48hCorso Iphone in 48h
Corso Iphone in 48h
 
MS_corso base iOS iPhone_partI
MS_corso base iOS iPhone_partIMS_corso base iOS iPhone_partI
MS_corso base iOS iPhone_partI
 
Python@Unina - Theory
Python@Unina - TheoryPython@Unina - Theory
Python@Unina - Theory
 
T3 esempio runtime
T3 esempio runtimeT3 esempio runtime
T3 esempio runtime
 
Programmazione funzionale e Stream in Java
Programmazione funzionale e Stream in JavaProgrammazione funzionale e Stream in Java
Programmazione funzionale e Stream in Java
 
OOP with C#
OOP with C#OOP with C#
OOP with C#
 
Corso Programmazione Java Base
Corso Programmazione Java BaseCorso Programmazione Java Base
Corso Programmazione Java Base
 
Spyppolare o non spyppolare
Spyppolare o non spyppolareSpyppolare o non spyppolare
Spyppolare o non spyppolare
 
C# Language Evolution
C# Language EvolutionC# Language Evolution
C# Language Evolution
 
Corso pratico di C# - 2013
Corso pratico di C# - 2013Corso pratico di C# - 2013
Corso pratico di C# - 2013
 

Similar to Py t3 python-oggetti

Similar to Py t3 python-oggetti (20)

Object Oriented with Java Programmazione Base
Object Oriented with Java Programmazione BaseObject Oriented with Java Programmazione Base
Object Oriented with Java Programmazione Base
 
Programmazione ad oggetti
Programmazione ad oggettiProgrammazione ad oggetti
Programmazione ad oggetti
 
Corso Java
Corso JavaCorso Java
Corso Java
 
Java lezione 4
Java lezione 4Java lezione 4
Java lezione 4
 
Programmaoggetti[1]
Programmaoggetti[1]Programmaoggetti[1]
Programmaoggetti[1]
 
[Objective-C] - Introduzione
[Objective-C] - Introduzione[Objective-C] - Introduzione
[Objective-C] - Introduzione
 
Java5
Java5Java5
Java5
 
Lezione01
Lezione01Lezione01
Lezione01
 
Lezione01
Lezione01Lezione01
Lezione01
 
Gianfrasoft Corso Di Php Parte 3
Gianfrasoft   Corso Di Php   Parte 3Gianfrasoft   Corso Di Php   Parte 3
Gianfrasoft Corso Di Php Parte 3
 
Strutture dati 04-funzionicustom-classioggetti
Strutture dati 04-funzionicustom-classioggettiStrutture dati 04-funzionicustom-classioggetti
Strutture dati 04-funzionicustom-classioggetti
 
Data mining 04-funzionicustom-classioggetti
Data mining 04-funzionicustom-classioggettiData mining 04-funzionicustom-classioggetti
Data mining 04-funzionicustom-classioggetti
 
Java lezione 19
Java lezione 19Java lezione 19
Java lezione 19
 
Corso Java 1 - BASE
Corso Java 1 - BASECorso Java 1 - BASE
Corso Java 1 - BASE
 
What's new in C# 7
What's new in C# 7What's new in C# 7
What's new in C# 7
 
Metodi Per Riutilizzare Programmi Oo
Metodi Per Riutilizzare Programmi OoMetodi Per Riutilizzare Programmi Oo
Metodi Per Riutilizzare Programmi Oo
 
Java SE 5. Capitolo 01: Base
 Java SE 5. Capitolo 01: Base Java SE 5. Capitolo 01: Base
Java SE 5. Capitolo 01: Base
 
Introduzione a scala prima parte
Introduzione a scala   prima parteIntroduzione a scala   prima parte
Introduzione a scala prima parte
 
Lezione anonymousinnerclass
Lezione anonymousinnerclassLezione anonymousinnerclass
Lezione anonymousinnerclass
 
Vb.net
 Vb.net Vb.net
Vb.net
 

More from Majong DevJfu

9 - Architetture Software - SOA Cloud
9 - Architetture Software - SOA Cloud9 - Architetture Software - SOA Cloud
9 - Architetture Software - SOA CloudMajong DevJfu
 
8 - Architetture Software - Architecture centric processes
8 - Architetture Software - Architecture centric processes8 - Architetture Software - Architecture centric processes
8 - Architetture Software - Architecture centric processesMajong DevJfu
 
7 - Architetture Software - Software product line
7 - Architetture Software - Software product line7 - Architetture Software - Software product line
7 - Architetture Software - Software product lineMajong DevJfu
 
6 - Architetture Software - Model transformation
6 - Architetture Software - Model transformation6 - Architetture Software - Model transformation
6 - Architetture Software - Model transformationMajong DevJfu
 
5 - Architetture Software - Metamodelling and the Model Driven Architecture
5 - Architetture Software - Metamodelling and the Model Driven Architecture5 - Architetture Software - Metamodelling and the Model Driven Architecture
5 - Architetture Software - Metamodelling and the Model Driven ArchitectureMajong DevJfu
 
4 - Architetture Software - Architecture Portfolio
4 - Architetture Software - Architecture Portfolio4 - Architetture Software - Architecture Portfolio
4 - Architetture Software - Architecture PortfolioMajong DevJfu
 
3 - Architetture Software - Architectural styles
3 - Architetture Software - Architectural styles3 - Architetture Software - Architectural styles
3 - Architetture Software - Architectural stylesMajong DevJfu
 
2 - Architetture Software - Software architecture
2 - Architetture Software - Software architecture2 - Architetture Software - Software architecture
2 - Architetture Software - Software architectureMajong DevJfu
 
1 - Architetture Software - Software as a product
1 - Architetture Software - Software as a product1 - Architetture Software - Software as a product
1 - Architetture Software - Software as a productMajong DevJfu
 
10 - Architetture Software - More architectural styles
10 - Architetture Software - More architectural styles10 - Architetture Software - More architectural styles
10 - Architetture Software - More architectural stylesMajong DevJfu
 

More from Majong DevJfu (20)

9 - Architetture Software - SOA Cloud
9 - Architetture Software - SOA Cloud9 - Architetture Software - SOA Cloud
9 - Architetture Software - SOA Cloud
 
8 - Architetture Software - Architecture centric processes
8 - Architetture Software - Architecture centric processes8 - Architetture Software - Architecture centric processes
8 - Architetture Software - Architecture centric processes
 
7 - Architetture Software - Software product line
7 - Architetture Software - Software product line7 - Architetture Software - Software product line
7 - Architetture Software - Software product line
 
6 - Architetture Software - Model transformation
6 - Architetture Software - Model transformation6 - Architetture Software - Model transformation
6 - Architetture Software - Model transformation
 
5 - Architetture Software - Metamodelling and the Model Driven Architecture
5 - Architetture Software - Metamodelling and the Model Driven Architecture5 - Architetture Software - Metamodelling and the Model Driven Architecture
5 - Architetture Software - Metamodelling and the Model Driven Architecture
 
4 - Architetture Software - Architecture Portfolio
4 - Architetture Software - Architecture Portfolio4 - Architetture Software - Architecture Portfolio
4 - Architetture Software - Architecture Portfolio
 
3 - Architetture Software - Architectural styles
3 - Architetture Software - Architectural styles3 - Architetture Software - Architectural styles
3 - Architetture Software - Architectural styles
 
2 - Architetture Software - Software architecture
2 - Architetture Software - Software architecture2 - Architetture Software - Software architecture
2 - Architetture Software - Software architecture
 
1 - Architetture Software - Software as a product
1 - Architetture Software - Software as a product1 - Architetture Software - Software as a product
1 - Architetture Software - Software as a product
 
10 - Architetture Software - More architectural styles
10 - Architetture Software - More architectural styles10 - Architetture Software - More architectural styles
10 - Architetture Software - More architectural styles
 
Uml3
Uml3Uml3
Uml3
 
Uml2
Uml2Uml2
Uml2
 
6
66
6
 
5
55
5
 
4 (uml basic)
4 (uml basic)4 (uml basic)
4 (uml basic)
 
3
33
3
 
2
22
2
 
1
11
1
 
Tmd template-sand
Tmd template-sandTmd template-sand
Tmd template-sand
 
26 standards
26 standards26 standards
26 standards
 

Py t3 python-oggetti

  • 1. Parte 2 Programmazione ad oggetti in Python Linguaggi dinamici – A.A. 2009/2010 1
  • 2. Introduzione „ Unità fondamentale degli oggetti: classe „ Contenitore di variabili (attributi) e funzioni (metodi) „ Strumenti a di St ti disposizione della OOP i i d ll „ Astrazione: capacità di ridurre il numero di dettagli implementativi d li i l i i „ Incapsulamento: capacità di nascondere i dettagli ai moduli esterni „ Ereditarietà: capacità di perfezionare il comportamento di una classe „ Polimorfismo: capacità di adattare il comportamento in funzione di ingressi e uscita Linguaggi dinamici – A.A. 2009/2010 2
  • 3. Definizione di classe in Python „ Una classe è definita all'interno di un modulo, tramite lo statement class class ClassName: <statement 1> < t t t … <statement n> „ Solitamente, gli statement sono definizioni di funzioni (ma non è necessariamente detto) „ La definizione di una classe crea un nuovo namespace, che viene usato come lo scope della classe (variabili locali) Linguaggi dinamici – A.A. 2009/2010 3
  • 4. Oggetti “classe” „ Al termine della definizione di una classe, l interprete l'interprete crea un oggetto di tipo classe „ Tale oggetto abilita due operazioni: „ Attribute f Att ib t reference: permette l' tt l'accesso aglili elementi di una classe (attributi e metodi), tramite la sintassi NomeClasse nome elemento NomeClasse.nome_elemento „ Instantiation: permette la creazione di istanze di classe (oggetti) tramite la notazione funzionale variabile = NomeClasse() „ L'istanziazione si preoccupa di invocare il L'i t i i i i metodo costruttore della classe Linguaggi dinamici – A.A. 2009/2010 4
  • 5. Creazione di un oggetto „ Un oggetto viene creato “chiamando” la classe „ o = MyClass() „ Alla variabile o viene assegnato un riferimento ad un oggetto di classe MyClass „ Ricordarsi di importare il nome della classe se è definito in un namespace diverso „ Ad es., se MyClass è definita nel file MyClass.py M Cl „ from MyClass import MyClass namespace p classe Linguaggi dinamici – A.A. 2009/2010 5
  • 6. ÆESEMPI Il metodo costruttore Bag.py Complex.py „ Il metodo costruttore di una classe ha il nome __init__, e viene invocato automaticamente in init seguito all'istanziazione di una classe „ Il metodo __init__, per il resto, gode di tutte le init resto proprietà delle funzioni „ Argomenti con nome A ti „ Argomenti di default „ C’è sempre un argomento implicito che rappresenta l’oggetto „ Lo stato interno di un oggetto è dichiarato tramite opportune strutture dati pp Linguaggi dinamici – A.A. 2009/2010 6
  • 7. ÆESEMPI Attributi di dati Complex2.py „ Il Python permette la creazione automatica di attributi all interno di un oggetto, tramite all'interno oggetto semplici operazioni di assegnazione „ Ad esempio, posso creare un attributo counter esempio al volo su un oggetto x: x.counter = 1 t „ counter viene trattato alla stregua di una variabile di appoggio, valida solo per l'istanza x „ Quando x viene distrutto, counter sparisce „ counter può essere distrutto con del p Linguaggi dinamici – A.A. 2009/2010 7
  • 8. Metodi „ È possibile invocare i metodi di un oggetto o di una classe con la notazione . risultato = oggetto.metodo(argomenti) „ Il primo argomento di ogni metodo, che viene i t i t d h i passato implicitamente dall'interprete, è „ la reference all'oggetto istanza, se il metodo è stato invocato tramite un'istanza „ la reference all'oggetto classe, se il metodo è stato invocato tramite la classe „ Per convenzione, il primo argomento viene nominato self Linguaggi dinamici – A.A. 2009/2010 8
  • 9. Metodi „ Si noti che la chiamata „ x = MyClass() „ x.m() „ corrisponde a: i d „ MyClass.m(x) „ E in effetti il metodo è definito così: „ class MyClass: „ def m(self): „ … Linguaggi dinamici – A.A. 2009/2010 9
  • 10. ÆESEMPI Metodi C.py „ È anche possibile sfruttare funzioni definite fuori dalla classe „ Attraverso una variabile della classe che rappresenta la funzione esterna „ È valido anche per metodi definiti internamente alla classe Linguaggi dinamici – A.A. 2009/2010 10
  • 11. Distruttori „ In maniera simile al Perl, è previsto un meccanismo di reference counting degli oggetti „ Si invoca la procedura di distruzione quando: „ il reference count di un oggetto diventa nullo „ si invoca il metodo del() sull'oggetto ii d d l() ll' „ Procedura di distruzione: l'interprete invoca il metodo privato __del__() dell'oggetto (che sia definito nell'oggetto stesso o ereditato da una superclasse) Linguaggi dinamici – A.A. 2009/2010 11
  • 12. ÆESEMPI Ereditarietà Ereditarieta.py „ Una classe può ereditare da un'altra classe con la seguente sintassi: class DerivedClassName(BaseClassName): <statement 1> < t t t … <statement n> „ È possibile usare il nome completo della p p superclasse (comodo nelle situazioni in cui la superclasse è definita in un altro file) p ) „ Altrimenti ricordarsi di importare la classe dal modulo Linguaggi dinamici – A.A. 2009/2010 12
  • 13. Ereditarietà multipla „ Una classe può ereditare da più classi con la seguente sintassi: class DerivedClassName(C1, C2, C3): <statement 1> < t t t … <statement n> „ È possibile usare il nome completo delle p p superclassi „ La ricerca di un elemento non in C avviene per profondità prima in C1 (e superclassi), poi in C2 (e superclassi), e infine in C3 (e superclassi) Linguaggi dinamici – A.A. 2009/2010 13
  • 14. Funzioni relative all’ereditarietà „ Il Python definisce due funzioni nel contesto dell ereditarietà dell'ereditarietà „ isinstance(obj, objtype): ritorna True se obj è un'istanza della classe objtype un istanza „ issubclass(obj, objtype): ritorna True se obj è una sottoclasse di objtype tt l bjt Linguaggi dinamici – A.A. 2009/2010 14
  • 15. Polimorfismo „ È sufficiente ridefinire un metodo all'interno di una sottoclasse per sostituirlo alle definizioni presenti nelle superclassi „ L'interprete Python gestisce il polimorfismo L interprete automaticamente, andandosi a cercare il metodo con la signature adatta „ All'interno di un metodo ridefinito nella sottoclasse, è possibile invocare il metodo tt l ibil i t d della superclasse con la seguente sintassi: BaseClassName.methodname(self, arguments) Linguaggi dinamici – A.A. 2009/2010 15
  • 16. ÆESEMPI Variabili private Private.py „ Ogni identificatore (variabile, metodo) __ident_ con almeno due underscore davanti ed al più un underscore dietro viene rinominato internamente in _c ass a e__ident, dove te a e te classname de t, do e classname è il nome della classe corrente senza gli underscore iniziali g Linguaggi dinamici – A.A. 2009/2010 16
  • 17. Vecchio e nuovo stile della POO „ Nel vecchio stile: „ Le classi sono oggetti „ La ricerca di attributi avviene con un algoritmo statico (depth-first left-to-right) (depth-first, „ Nel nuovo stile: „ Le l L classi sono ti i i tipi „ La ricerca di attributi avviene in modo dinamico „ La gerarchia ha una radice: object „ Il nuovo stile gestisce meglio casi di eredità “a diamante”, in cui la stessa superclasse è raggiungibile tramite percorsi diversi Linguaggi dinamici – A.A. 2009/2010 17
  • 18. ÆESEMPI super Counter.py Counter2.py „ In Python non c’è il concetto di super „ Mancanza dovuta anche alla presenza di ereditarietà multipla „ Esiste però la funzione super(type object) che super(type, restituisce il “super tipo” della classe corrente „ Funziona solo con il nuovo stile di classi „ È necessario che all’apice della gerarchia ci sia object Linguaggi dinamici – A.A. 2009/2010 18
  • 19. ÆESEMPI Iteratori Reverse.py „ Il metodo __iter__ definisce un iteratore per la classe corrente „ Tale oggetto deve contenere un metodo next() „ Il metodo next definisce lo step di iterazione „ Seleziona un elemento diverso ad ogni invocazione „ Solleva una eccezione di tipo StopIteration quando tutti gli elementi sono stati selezionati Linguaggi dinamici – A.A. 2009/2010 19