Classi e oggetti Python (con esempi)

In questo tutorial imparerai le funzionalità principali degli oggetti e delle classi Python. Imparerai cos'è una classe, come crearla e usarla nel tuo programma.

Video: classi e oggetti Python

Oggetti e classi Python

Python è un linguaggio di programmazione orientato agli oggetti. A differenza della programmazione orientata alle procedure, dove l'enfasi principale è sulle funzioni, la programmazione orientata agli oggetti pone l'accento sugli oggetti.

Un oggetto è semplicemente una raccolta di dati (variabili) e metodi (funzioni) che agiscono su quei dati. Allo stesso modo, una classe è un modello per quell'oggetto.

Possiamo pensare alla classe come a uno schizzo (prototipo) di una casa. Contiene tutti i dettagli sui pavimenti, porte, finestre ecc. Sulla base di queste descrizioni costruiamo la casa. La casa è l'oggetto.

Poiché molte case possono essere realizzate dal progetto di una casa, possiamo creare molti oggetti da una classe. Un oggetto è anche chiamato istanza di una classe e il processo di creazione di questo oggetto è chiamato istanziazione .

Definizione di una classe in Python

Come le definizioni di funzione iniziano con la parola chiave def in Python, le definizioni di classe iniziano con una parola chiave di classe.

La prima stringa all'interno della classe si chiama docstring e ha una breve descrizione della classe. Sebbene non obbligatorio, questo è altamente raccomandato.

Ecco una semplice definizione di classe.

 class MyNewClass: '''This is a docstring. I have created a new class''' pass

Una classe crea un nuovo spazio dei nomi locale in cui sono definiti tutti i suoi attributi. Gli attributi possono essere dati o funzioni.

Ci sono anche attributi speciali che iniziano con doppi trattini bassi __. Ad esempio, __doc__ci fornisce la docstring di quella classe.

Non appena definiamo una classe, viene creato un nuovo oggetto classe con lo stesso nome. Questo oggetto di classe ci consente di accedere ai diversi attributi e di istanziare nuovi oggetti di quella classe.

 class Person: "This is a person class" age = 10 def greet(self): print('Hello') # Output: 10 print(Person.age) # Output: print(Person.greet) # Output: 'This is my second class' print(Person.__doc__)

Produzione

 10 Questa è una classe personale

Creazione di un oggetto in Python

Abbiamo visto che l'oggetto della classe potrebbe essere utilizzato per accedere a diversi attributi.

Può anche essere utilizzato per creare nuove istanze di oggetti (istanza) di quella classe. La procedura per creare un oggetto è simile a una chiamata di funzione.

 >>> harry = Person()

Questo creerà una nuova istanza di oggetto denominata harry. Possiamo accedere agli attributi degli oggetti usando il prefisso del nome dell'oggetto.

Gli attributi possono essere dati o metodi. I metodi di un oggetto sono funzioni corrispondenti di quella classe.

Ciò significa che, poiché Person.greetè un oggetto funzione (attributo di classe), Person.greetsarà un oggetto metodo.

 class Person: "This is a person class" age = 10 def greet(self): print('Hello') # create a new object of Person class harry = Person() # Output: print(Person.greet) # Output:  print(harry.greet) # Calling object's greet() method # Output: Hello harry.greet() 

Produzione

  Ciao 

Potresti aver notato il selfparametro nella definizione della funzione all'interno della classe, ma abbiamo chiamato il metodo semplicemente come harry.greet()senza argomenti. Funzionava ancora.

Questo perché, ogni volta che un oggetto chiama il suo metodo, l'oggetto stesso viene passato come primo argomento. Quindi, si harry.greet()traduce in Person.greet(harry).

In generale, chiamare un metodo con un elenco di n argomenti equivale a chiamare la funzione corrispondente con un elenco di argomenti creato inserendo l'oggetto del metodo prima del primo argomento.

Per questi motivi, il primo argomento della funzione in classe deve essere l'oggetto stesso. Questo è convenzionalmente chiamato sé. Può essere denominato diversamente, ma consigliamo vivamente di seguire la convenzione.

Ora devi avere familiarità con l'oggetto classe, oggetto istanza, oggetto funzione, oggetto metodo e le loro differenze.

Costruttori in Python

Le funzioni di classe che iniziano con un doppio trattino basso __sono chiamate funzioni speciali poiché hanno un significato speciale.

Di un particolare interesse è la __init__()funzione. Questa funzione speciale viene chiamata ogni volta che viene istanziato un nuovo oggetto di quella classe.

This type of function is also called constructors in Object Oriented Programming (OOP). We normally use it to initialize all the variables.

 class ComplexNumber: def __init__(self, r=0, i=0): self.real = r self.imag = i def get_data(self): print(f'(self.real)+(self.imag)j') # Create a new ComplexNumber object num1 = ComplexNumber(2, 3) # Call get_data() method # Output: 2+3j num1.get_data() # Create another ComplexNumber object # and create a new attribute 'attr' num2 = ComplexNumber(5) num2.attr = 10 # Output: (5, 0, 10) print((num2.real, num2.imag, num2.attr)) # but c1 object doesn't have attribute 'attr' # AttributeError: 'ComplexNumber' object has no attribute 'attr' print(num1.attr)

Output

 2+3j (5, 0, 10) Traceback (most recent call last): File "", line 27, in print(num1.attr) AttributeError: 'ComplexNumber' object has no attribute 'attr'

In the above example, we defined a new class to represent complex numbers. It has two functions, __init__() to initialize the variables (defaults to zero) and get_data() to display the number properly.

An interesting thing to note in the above step is that attributes of an object can be created on the fly. We created a new attribute attr for object num2 and read it as well. But this does not create that attribute for object num1.

Deleting Attributes and Objects

Qualsiasi attributo di un oggetto può essere cancellato in qualsiasi momento, utilizzando l' delistruzione. Prova quanto segue sulla shell Python per vedere l'output.

 >>> num1 = ComplexNumber(2,3) >>> del num1.imag >>> num1.get_data() Traceback (most recent call last):… AttributeError: 'ComplexNumber' object has no attribute 'imag' >>> del ComplexNumber.get_data >>> num1.get_data() Traceback (most recent call last):… AttributeError: 'ComplexNumber' object has no attribute 'get_data'

Possiamo anche eliminare l'oggetto stesso, usando l'istruzione del.

 >>> c1 = ComplexNumber(1,3) >>> del c1 >>> c1 Traceback (most recent call last):… NameError: name 'c1' is not defined

In realtà, è più complicato di così. Quando lo facciamo c1 = ComplexNumber(1,3), un nuovo oggetto istanza viene creato in memoria e il nome c1 si lega ad esso.

Sul comando del c1, questa associazione viene rimossa e il nome c1 viene eliminato dallo spazio dei nomi corrispondente. L'oggetto tuttavia continua ad esistere in memoria e se nessun altro nome è associato ad esso, viene successivamente distrutto automaticamente.

Questa distruzione automatica di oggetti non referenziati in Python è anche chiamata garbage collection.

L'eliminazione di oggetti in Python rimuove l'associazione del nome

Articoli interessanti...