HOWTO · Python
Como imprimir os atributos de um objeto em Python
Aprenda a acessar e imprimir atributos de objetos em Python usando diferentes abordagens.
Nesta página
Para imprimir um atributo conhecido, acesse-o com a notação de ponto e passe seu valor a print(). Se o nome estiver armazenado em uma string, use getattr(); para inspecionar os atributos armazenados na instância, use __dict__ ou vars() quando estiverem disponíveis; e, para descobrir os nomes que Python expõe para um objeto, use dir(). Cada abordagem mostra uma visão diferente do objeto: escolha conforme você precise de um valor, do mapeamento da instância ou de uma lista mais ampla de nomes.
Uma classe Person pode definir atributos de classe, enquanto cada objeto também pode armazenar seus próprios atributos de instância. Nos exemplos a seguir, criaremos uma pessoa com nome, idade e cidade.
Imprimir atributos de um objeto em Python usando print e acesso a atributos
Quando você sabe o nome do atributo, a notação de ponto é a forma mais direta de acessá-lo. Passe o valor à função interna 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
A expressão lê name desta instância e escreve seu valor na saída padrão.
Imprimir atributos de um objeto em Python usando a função getattr
Use getattr() quando o nome do atributo estiver em uma variável ou for determinado durante a execução. O segundo argumento precisa ser uma string. Um terceiro argumento opcional define um valor alternativo caso o nome não esteja disponível; se você omiti-lo, a ausência do atributo gera 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
Altere attribute_name para selecionar outro atributo ou ajuste o valor padrão conforme a necessidade da aplicação. Sem o terceiro argumento, um nome inexistente gera AttributeError.
Imprimir atributos de um objeto em Python usando o atributo __dict__
O __dict__ de uma instância é seu mapeamento de atributos, quando ela o disponibiliza. Esse mapeamento contém atributos armazenados na própria instância, como os valores atribuídos a self.name em __init__; ele não inclui atributos definidos apenas na 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
Alguns objetos não disponibilizam um __dict__ de instância. É o caso, por exemplo, de instâncias de classes que usam __slots__ sem um dicionário. Portanto, essa abordagem não funciona para todos os objetos.
Imprimir atributos de um objeto em Python usando a função dir()
Chame dir(person) para obter uma lista ordenada dos nomes que Python expõe para inspeção. A lista pode incluir atributos da instância e da classe, métodos e nomes especiais; ela não contém apenas os dados armazenados na instância. Para exibir uma lista longa em um formato mais legível, use a função pprint() da biblioteca padrão:
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
Essa verificação mostra que name está entre os nomes expostos. Os nomes exatos dependem do objeto e de sua classe, e uma implementação personalizada de __dir__() pode alterar o resultado de dir(). Por isso, use dir() para descobrir nomes, e não como uma cópia do dicionário da instância. Para ver a lista completa em um formato legível, passe dir(person) à função pprint().
Imprimir atributos de um objeto em Python usando a função vars()
Para um objeto que disponibiliza __dict__, vars(person) retorna o mesmo mapeamento de atributos da instância. Você pode passar esse mapeamento a pprint() para formatá-lo e facilitar a leitura:
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
Chamar vars() sem argumento tem outra finalidade: a função retorna a tabela de símbolos local atual. Se o objeto passado não tiver __dict__, a chamada gera TypeError. Portanto, use essa função quando quiser o mapeamento da instância e souber que o objeto o disponibiliza. Para formatar o mapeamento completo, passe vars(person) à função pprint().
Conclusão
Escolha o método de inspeção de acordo com a tarefa: use acesso por ponto com print() para imprimir um valor conhecido, getattr() para um nome de atributo dinâmico, __dict__ ou vars() para consultar os atributos armazenados na instância quando ela disponibilizar um dicionário, e dir() para descobrir um conjunto mais amplo de nomes. Lembre-se de que dir() pode incluir métodos e nomes especiais, enquanto o dicionário da instância contém apenas os atributos armazenados naquela instância.