programmazione ad oggetti python programmazione ad oggetti

Python è un linguaggio molto versatile che prevede anche la programmazione ad oggetti.

In questo articolo vdremo i principi fondamentali della programmazione orientata agli oggetti (OOP) in Python.

Dall’incapsulamento all’ereditarietà, alle classi astratte e agli iteratori, tratteremo i concetti essenziali che ti consentono di creare codice modulare, riutilizzabile e scalabile.

8 minuti

Nella programmazione ad oggetti Python andiamo a vedere come implementare l’incapsulamento, l’ereditarietà, il polimorfismo, le classi astratte e agli iteratori. Tratteremo i concetti essenziali che ti consentono di creare codice modulare, riutilizzabile e scalabile.

Classi e oggetti Python

Una classe è un modello o prototipo definito dall’utente da cui vengono creati oggetti. Le classi forniscono un mezzo per raggruppare dati e funzionalità. La creazione di una nuova classe crea un nuovo tipo di oggetto, consentendo la creazione di nuove istanze di quel tipo. Ogni istanza di classe può avere attributi ad essa associati per mantenere il suo stato. Le istanze di classe possono anche avere metodi (definiti dalla loro classe) per modificare il loro stato.

Per comprendere la necessità di creare una classe e un oggetto in Python.

Consideriamo un esempio: supponiamo che tu voglia tracciare il numero di cani che potrebbero avere attributi diversi come razza ed età. Se viene utilizzato un elenco, il primo elemento potrebbe essere la razza del cane, mentre il secondo elemento potrebbe rappresentare la sua età.

Supponiamo che ci siano 100 cani diversi, come faresti a sapere quale elemento dovrebbe essere quale?

E se volessi aggiungere altre proprietà a questi cani?

Questo manca di organizzazione ed è esattamente l’esigenza delle classi.

Sintassi: Definizione della classe

class ClassName:
# Statement

Sintassi: Definizione dell’oggetto

obj = ClassName()
print(obj.atrr)

La classe crea una struttura dati definita dall’utente , che contiene i propri membri dati e funzioni membro, a cui si può accedere e che si possono usare creando un’istanza di quella classe. Una classe è come un progetto per un oggetto.

Alcuni punti sulla classe Python:

  • Le classi vengono create tramite la parola chiave class.
  • Gli attributi sono le variabili che appartengono a una classe.
  • Gli attributi sono sempre pubblici e sono accessibili tramite l’operatore punto (.). Ad esempio: My class.Myattribute

Creazione di una classe Python

Qui, la parola chiave class indica che si sta creando una classe, seguita dal nome della classe (in questo caso Cane).

class Dog:
sound = "bark"

Oggetto della classe Python

Nella programmazione Python un Object è un’istanza di una Class. Una class è come un progetto mentre un’istanza è una copia della class con valori effettivi . Non è più un’idea, è un cane vero e proprio, come un cane di razza carlino di sette anni. Puoi avere molti cani per creare molte istanze diverse, ma senza la class come guida, saresti perso, non sapendo quali informazioni sono richieste.

Un oggetto è costituito da:

  • Stato: è rappresentato dagli attributi di un oggetto. Riflette anche le proprietà di un oggetto.
  • Comportamento: è rappresentato dai metodi di un oggetto. Riflette anche la risposta di un oggetto ad altri oggetti.
  • Identità: assegna un nome univoco a un oggetto e consente a un oggetto di interagire con altri oggetti.

Dichiarazione di oggetti di classe (chiamata anche istanziazione di una classe)

Quando viene creato un oggetto di una classe, si dice che la classe è istanziata. Tutte le istanze condividono gli attributi e il comportamento della classe. Ma i valori di quegli attributi, ovvero lo stato, sono unici per ogni oggetto. Una singola classe può avere un numero qualsiasi di istanze.

Esempio di classe e oggetto Python

Creare un oggetto in Python implica l’istanziazione di una classe per creare una nuova istanza di quella classe. Questo processo è anche definito istanziazione di oggetto.

# Python3 program to
# demonstrate instantiating
# a class
class Dog:

# A simple class
# attribute
attr1 = "mammal"
attr2 = "dog"

# A sample method
def fun(self):
print("I'm a", self.attr1)
print("I'm a", self.attr2)


# Driver code
# Object instantiation
Rodger = Dog()

# Accessing class attributes
# and method through objects
print(Rodger.attr1)
Rodger.fun()

Output:

mammal
I'm a mammal
I'm a dog

Nell’esempio sopra, viene creato un oggetto che è fondamentalmente un cane di nome Rodger. Questa classe ha solo due attributi di classe che ci dicono che Rodger è un cane e un mammifero.

Spiegazione:

In questo esempio, stiamo creando una classe Dog e abbiamo creato due variabili di classe attr1 e attr2 . Abbiamo creato un metodo denominato fun() che restituisce la stringa “I’m a, {attr1}” e I’m a, {attr2}. Abbiamo creato un oggetto della classe Dog e stiamo stampando all’attr1 dell’oggetto . Infine, stiamo chiamando la funzione fun() .

Parametro self

Quando chiamiamo un metodo di questo oggetto come myobject.method(arg1, arg2), questo viene automaticamente convertito da Python in MyClass.method(myobject, arg1, arg2): questo è tutto ciò di cui si occupa il self speciale . 

class GFG:
def __init__(self, name, company):
self.name = name
self.company = company

def show(self):
print("Hello my name is " + self.name+" and I" +
" work in "+self.company+".")


obj = GFG("John", "BlogInnovazione")
obj.show()

Il parametro Self non lo chiama Self, puoi usare qualsiasi altro nome al suo posto. Qui cambiamo il self nella parola someone e l’output sarà lo stesso.

class GFG:
def __init__(somename, name, company):
somename.name = name
somename.company = company

def show(somename):
print("Hello my name is " + somename.name +
" and I work in "+somename.company+".")


obj = GFG("John", "BlogInnovazione")
obj.show()

Output: l’output per entrambi i codici sarà lo stesso.

Hello my name is John and I work in BlogInnovazione.

Spiegazione:

In questo esempio, stiamo creando una classe GFG e abbiamo creato le variabili di istanza name e company nel costruttore. Abbiamo creato un metodo denominato say_hi() che restituisce la stringa “Hello my name is ” + {name} +” and I work in “+{company}+”.”. Abbiamo creato un oggetto di classe person e stiamo passando il nome John e Company BlogInnovazione alla variabile di istanza. Infine, stiamo chiamando show() della classe.

Istruzione Pass

L’esecuzione del programma non è influenzata dall’inazione dell’istruzione pass . Permette semplicemente al programma di saltare quella sezione del codice senza fare nulla. Viene spesso utilizzata quando i vincoli sintattici di Python richiedono un’istruzione valida ma non deve essere eseguito alcun codice utile.

class MyClass:
pass

Metodo __init__()

Nella programmazione ad oggetti python, il metodo __init__ è il metodo costruttore, simile ai costruttori in C++ e Java . I costruttori sono usati per inizializzare lo stato dell’oggetto. Come i metodi, un costruttore contiene anche una raccolta di istruzioni (ad esempio istruzioni) che vengono eseguite al momento della creazione dell’oggetto. Viene eseguito non appena un oggetto di una classe viene istanziato. Il metodo è utile per fare qualsiasi inizializzazione tu voglia fare con il tuo oggetto.

# Sample class with init method
class Person:

# init method or constructor
def __init__(self, name):
self.name = name

# Sample Method
def say_hi(self):
print('Hello, my name is', self.name)


p = Person('Nikhil')
p.say_hi()

Output: 

Hello, my name is Nikhil

Spiegazione:

In questo esempio, stiamo creando una classe Person e abbiamo creato una variabile istanza name nel costruttore. Abbiamo creato un metodo denominato say_hi() che restituisce la stringa “Hello, my name is {name}”. Abbiamo creato un oggetto di classe person e passiamo il nome Nikhil alla variabile istanza. Infine, stiamo chiamando say_hi() della classe.

Metodo __str__()

Python ha un metodo particolare chiamato __str__() . che viene utilizzato per definire come un oggetto di classe dovrebbe essere rappresentato come una stringa. Viene spesso utilizzato per dare a un oggetto una rappresentazione testuale leggibile dall’uomo, utile per la registrazione, il debug o per mostrare agli utenti informazioni sull’oggetto. Quando un oggetto di classe viene utilizzato per creare una stringa utilizzando le funzioni integrate print() e str(), viene utilizzata automaticamente la funzione __str__() . È possibile modificare il modo in cui gli oggetti di una classe sono rappresentati in stringhe definendo il metodo __str__() .

class GFG:
def __init__(self, name, company):
self.name = name
self.company = company

def __str__(self):
return f"My name is {self.name} and I work in {self.company}."


my_obj = GFG("John", "BlogInnovazione")
print(my_obj)

Output:

My name is John and I work in BlogInnovazione.

Spiegazione:

In questo esempio, stiamo creando una classe denominata GFG. Nella classe, stiamo creando due variabili istanza name e company . Nel metodo __str__() stiamo restituendo la variabile istanza name e la variabile istanza company . Infine, stiamo creando l’oggetto della classe GFG e stiamo chiamando il metodo __str__().

Variabili di classe e istanza

Nella programmazione ad oggetti python, le variabili di istanza sono per i dati, univoche per ogni istanza e le variabili di classe sono per gli attributi e i metodi condivisi da tutte le istanze della classe. Le variabili di istanza sono variabili il cui valore è assegnato all’interno di un costruttore o metodo con self mentre le variabili di classe sono variabili il cui valore è assegnato nella classe.

Definizione di variabili istanza mediante un costruttore. 

# Python3 program to show that the variables with a value
# assigned in the class declaration, are class variables and
# variables inside methods and constructors are instance
# variables.

# Class for Dog


class Dog:

# Class Variable
animal = 'dog'

# The init method or constructor
def __init__(self, breed, color):

# Instance Variable
self.breed = breed
self.color = color


# Objects of Dog class
Rodger = Dog("Pug", "brown")
Buzo = Dog("Bulldog", "black")

print('Rodger details:')
print('Rodger is a', Rodger.animal)
print('Breed: ', Rodger.breed)
print('Color: ', Rodger.color)

print('\nBuzo details:')
print('Buzo is a', Buzo.animal)
print('Breed: ', Buzo.breed)
print('Color: ', Buzo.color)

# Class variables can be accessed using class
# name also
print("\nAccessing class variable using class name")
print(Dog.animal)

Output:

Rodger details:
Rodger is a dog
Breed: Pug
Color: brown
Buzo details:
Buzo is a dog
Breed: Bulldog
Color: black
Accessing class variable using class name
dog

Spiegazione:

Una classe denominata Dog è definita con una variabile di classe animal impostata sulla stringa “dog”. Le variabili di classe sono condivise da tutti gli oggetti di una classe e sono accessibili tramite il nome della classe. La classe Dog ha due variabili di istanza breed e color. In seguito creeremo due oggetti della classe Dog e stamperemo il valore di entrambi gli oggetti con una variabile di classe denominata animal.

Definizione delle variabili istanza utilizzando il metodo normale:

# Python3 program to show that we can create
# instance variables inside methods

# Class for Dog


class Dog:

# Class Variable
animal = 'dog'

# The init method or constructor
def __init__(self, breed):

# Instance Variable
self.breed = breed

# Adds an instance variable
def setColor(self, color):
self.color = color

# Retrieves instance variable
def getColor(self):
return self.color


# Driver Code
Rodger = Dog("pug")
Rodger.setColor("brown")
print(Rodger.getColor())

Output:

brown

Spiegazione:

In questo esempio, abbiamo definito una classe denominata Dog e abbiamo creato una variabile di classe animal. Abbiamo creato una variabile di istanza breed nel costruttore . La classe Dog è composta da due metodi setColor e getColo r, che vengono utilizzati per creare e inizializzare una variabile di istanza e recuperare il valore della variabile di istanza. Abbiamo creato un oggetto della classe Dog e abbiamo impostato il valore della variabile di istanza su brown e stiamo stampando il valore nel terminale.

Autore