HOWTO · Python

Come stampare gli attributi di un oggetto in Python

Scopri come stampare e ispezionare gli attributi di un oggetto in Python con cinque approcci pratici.

In questa pagina

Per stampare un attributo di cui conosci il nome, accedi al valore con la notazione a punto e passalo a print(). Se il nome è contenuto in una stringa, usa getattr(); per ispezionare gli attributi memorizzati sull’istanza, usa __dict__ o vars() quando disponibili. Per scoprire i nomi che Python espone per un oggetto, usa dir(). Questi metodi mostrano aspetti diversi dell’oggetto: scegli in base al fatto che ti serva un singolo valore, la mappatura dell’istanza o un elenco più ampio di nomi.

Una classe Person può definire attributi di classe, mentre ogni oggetto può memorizzare anche attributi specifici della propria istanza. Negli esempi seguenti creiamo una persona con nome, età e città.

Stampare gli attributi di un oggetto in Python con print e l’accesso agli attributi

Quando conosci il nome dell’attributo, la notazione a punto è il modo più diretto per leggerlo. Passa il valore alla funzione incorporata print():

class Person:
    def __init__(self, name, age, city):
        self.name = name
        self.age = age
        self.city = city

person = Person("John Doe", 30, "New York")
print(person.name)
John Doe

L’espressione legge name da questa istanza e ne scrive il valore sullo standard output.

Stampare gli attributi di un oggetto in Python con la funzione getattr

Usa getattr() quando il nome dell’attributo è contenuto in una variabile o viene determinato in un altro modo durante l’esecuzione. Il secondo argomento deve essere una stringa. Il terzo argomento, facoltativo, specifica il valore da restituire se il nome non è disponibile; se lo ometti, un attributo inesistente genera AttributeError.

class Person:
    def __init__(self, name, age, city):
        self.name = name
        self.age = age
        self.city = city

person = Person("John Doe", 30, "New York")
attribute_name = "city"
city = getattr(person, attribute_name, "Unknown")
print(city)
New York

Modifica attribute_name per selezionare un altro attributo oppure cambia il valore predefinito in base alle esigenze dell’applicazione. Senza il terzo argomento, un nome inesistente genera AttributeError.

Stampare gli attributi di un oggetto in Python con l’attributo __dict__

L’attributo __dict__ di un’istanza è la sua mappatura degli attributi, se l’istanza ne espone una. Contiene gli attributi memorizzati sull’istanza, come i valori assegnati a self.name in __init__; non include gli attributi definiti solo sulla classe.

class Person:
    def __init__(self, name, age, city):
        self.name = name
        self.age = age
        self.city = city

person = Person("John Doe", 30, "New York")
attributes = person.__dict__
print(attributes["name"])
John Doe

Alcuni oggetti non espongono un __dict__ per l’istanza: per esempio, può accadere con istanze di classi che usano __slots__ senza un dizionario. Di conseguenza, questo approccio non è universale.

Stampare gli attributi di un oggetto in Python con la funzione dir()

Chiama dir(person) per ottenere un elenco ordinato dei nomi che Python espone per l’ispezione. L’elenco può includere attributi dell’istanza e della classe, metodi e nomi speciali; non contiene soltanto i dati memorizzati sull’istanza. Per visualizzare un elenco lungo in un formato più leggibile, usa la funzione della libreria standard pprint():

class Person:
    def __init__(self, name, age, city):
        self.name = name
        self.age = age
        self.city = city

person = Person("John Doe", 30, "New York")
print("name" in dir(person))
True

Questo controllo mostra che name è tra i nomi esposti. I nomi esatti dipendono dall’oggetto e dalla sua classe; inoltre, un metodo __dir__() personalizzato può influenzare il risultato di dir(). Considera quindi dir() uno strumento per scoprire i nomi, non un’istantanea del dizionario dell’istanza. Per visualizzare l’elenco completo in un formato leggibile, passa dir(person) alla funzione pprint().

Stampare gli attributi di un oggetto in Python con la funzione vars()

Per un oggetto che espone __dict__, vars(person) restituisce la stessa mappatura degli attributi dell’istanza. Puoi passare la mappatura a pprint() per formattarla e leggerla più facilmente:

class Person:
    def __init__(self, name, age, city):
        self.name = name
        self.age = age
        self.city = city

person = Person("John Doe", 30, "New York")
print(vars(person)["name"])
John Doe

Chiamare vars() senza argomenti ha uno scopo diverso: restituisce la tabella dei simboli locale corrente. Se l’oggetto passato non espone __dict__, viene generato TypeError; usa quindi questa funzione quando ti serve la mappatura dell’istanza e sai che l’oggetto la fornisce. Per formattare l’intera mappatura, passa vars(person) alla funzione pprint().

Conclusione

Scegli il metodo in base al compito: usa l’accesso con il punto e print() per un singolo valore noto, getattr() per un nome di attributo dinamico, __dict__ o vars() per gli attributi memorizzati sull’istanza quando l’oggetto espone un dizionario, e dir() per scoprire un insieme più ampio di nomi. Ricorda che dir() può includere metodi e nomi speciali, mentre il dizionario dell’istanza contiene solo gli attributi memorizzati su quella specifica istanza.