Python ABC

Se vuoi imparare Python parti dall'ABC

View project on GitHub

Classi

Per creare una classe si utilizza l’istruzione class

class Human: 
    # Un attributo della classe. E' condiviso tra tutte 
    # le istanze delle classe
    species = "H. sapiens"

    # Si noti che i doppi underscore iniziali e finali denotano 
    # gli oggetti o attributi utilizzati da Python ma che vivono 
    # nel namespace controllato dall'utente.
    # Metodi, oggetti o attributi come: __init__, __str__, 
    # __repr__, etc. sono chiamati metodi speciali (o talvolta 
    # chiamati "dunder methods").
    # Non dovresti inventare tali nomi da solo.

    def __init__(self, name):
        # Assegna l'argomento all'attributo name dell'istanza
        self.name = name

    # Inizializza una proprietà
    self._age = 0

    # Un metodo dell'istanza. Tutti i metodi prendo "self"
    # come primo argomento
    def say(self, msg):
        print("{name}: {message}".format(name=self.name, message=msg))

    # Un altro metodo dell'istanza
    def sing(self):
        return 'yo... yo... microphone check... one two... '

    # Un metodo della classe è condiviso fra tutte le istanze
    # Sono chiamati con la classe chiamante come primo argomento
    @classmethod
    def get_species(cls):
        return cls.species

    # Un metodo statico è chiamato senza classe o istanza 
    # di riferimento
    @staticmethod
    def grunt():
        return "*grunt*"

    # Una property è come un metodo getter.
    # Trasforma il metodo age() in un attributo in sola lettura,  
    # che ha lo stesso nome 
    @property
    def age(self):
        return self._age

    # Questo metodo permette di modificare una property
    @age.setter
    def age(self, age):
        self._age = age

    # Questo metodo permette di cancellare una property
    @age.deleter
    def age(self):
        del self._age

Quando l’interprete Python legge un sorgente esegue tutto il suo codice. Il controllo su __name__ assicura che questo blocco di codice venga eseguito solo quando questo modulo è il programma principale.

if __name__ == '__main__':
    # Crea un'istanza della classe
    i = Human(name="Ian")
    i.say("hi")                     # "Ian: hi"
    j = Human("Joel")
    j.say("hello")                  # "Joel: hello"
    # i e j sono istanze del tipo Human, o in altre 
    # parole sono oggetti Human

    # Chiama un metodo della classe
    i.say(i.get_species())          # "Ian: H. sapiens"
    # Cambia l'attributo condiviso
    Human.species = "H. neanderthalensis"
    i.say(i.get_species())          # => "Ian: H. neanderthalensis"
    j.say(j.get_species())          # => "Joel: H. neanderthalensis"

    # Chiama un metodo statico 
    print(Human.grunt())            # => "*grunt*"
    
    # Non è possibile chiamare il metodo statico con l'istanza dell'oggetto
    # poiché i.grunt() metterà automaticamente "self" (l'oggetto i) 
    # come argomento 
    print(i.grunt())                # => TypeError: grunt() takes 0 positional arguments but 1 was given
                                    
    # Aggiorna la property (age) di questa istanza
    i.age = 42
    # Leggi la property
    i.say(i.age)                    # => "Ian: 42"
    j.say(j.age)                   # => "Joel: 0"
    # Cancella la property
    del i.age
    i.age                           # => questo genererà un AttributeError

This content is a derivative of “Learn X in Y minutes” by adambard, used under a CC BY-SA 3.0 license.