Metaclassi in Python

Rayven Esplanada 4 dicembre 2021
Metaclassi in Python

Questo tutorial discuterà cosa sono le metaclassi in un contesto orientato agli oggetti in Python.

Metaclassi in Python

In poche parole, una metaclasse definisce il comportamento di una classe. Una classe regolare definisce come si comporta un oggetto o un’istanza di una classe.

In Python, le metaclassi sono precostituite e implicite; ciò significa che una metaclasse viene creata in background durante la creazione di una classe.

La Classe Base object in Python

In Python, ogni classe creata eredita implicitamente la classe base object. All’interno della classe object sono integrati metodi privati ​​come __init__ e __new__. Prima ancora che una classe inizi a creare i propri campi, funzioni e attributi, eredita tutti gli attributi presenti nella classe object.

Creiamo una nuova classe, ChildObject, per esempio. All’interno di questa classe c’è una dichiarazione di un singolo attributo e di una singola funzione.

class ChildObject:
    num = 1

    def printStatement():
        print("This is a child object.")

Per verificare che la classe ChildObject erediti tutti gli attributi e le funzioni presenti nella classe object, utilizzare la funzione dir(), che restituisce un elenco di tutte le funzioni e gli attributi definiti in un oggetto specificato.

print(dir(ChildObject))

Produzione:

['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'num', 'printStatement']

Osserva che prima dell’attributo num e della funzione printStatement, ci sono alcuni attributi e funzioni privati ​​che non sono definiti esplicitamente in ChildObject; ciò significa che sono definiti implicitamente all’interno della classe o sono ereditati dalla classe object.

Controlliamo gli attributi e le funzioni della classe object utilizzando la stessa funzione dir():

print(dir(object))

Produzione:

['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

La metaclasse type in Python

Ora che abbiamo trattato la classe object, discutiamo della vera metaclasse in Python, type. Di nuovo, una metaclasse è una classe che istanzia e definisce il comportamento di un’altra classe.

Due funzioni possono esporre la metaclasse di una data classe: type() e __class__. Entrambe queste funzioni restituiscono la classe dell’argomento dato.

Ad esempio, usiamo le funzioni type() e __class__ sulla data classe ChildObject degli esempi precedenti.

class ChildObject:
    num = 1

    def printStatement():
        print("This is a child object.")


print(type(ChildObject))
print(ChildObject.__class__)

Produzione:

<class 'type'>
<class 'type'>

Entrambe le funzioni emettono <class 'type'>. Questo segnala che la classe ChildObject è di tipo type. type è la metaclasse della classe ChildObject e di qualsiasi altra classe.

In sintesi, type è la metaclasse che definisce implicitamente il comportamento di qualsiasi classe istanziata. Questa non è considerata conoscenza comune perché viene eseguita sullo sfondo del codice senza l’interferenza dello sviluppatore. Quindi il concetto di metaclasse è noto solo se qualcuno scava a fondo nel codice sorgente e nella documentazione di Python.

Rayven Esplanada avatar Rayven Esplanada avatar

Skilled in Python, Java, Spring Boot, AngularJS, and Agile Methodologies. Strong engineering professional with a passion for development and always seeking opportunities for personal and career growth. A Technical Writer writing about comprehensive how-to articles, environment set-ups, and technical walkthroughs. Specializes in writing Python, Java, Spring, and SQL articles.

LinkedIn

Articolo correlato - Python Class