Considere esta classe:
class foo(object):
pass
A representação de string padrão é algo como isto:
>>> str(foo)
"<class '__main__.foo'>"
Como faço para exibir essa string personalizada?
Implemente __str__()
ou __repr__()
na metaclasse da classe.
class MC(type):
def __repr__(self):
return 'Wahaha!'
class C(object):
__metaclass__ = MC
print C
Use __str__
se você quer dizer uma stringificação legível, use __repr__
para representações inequívocas.
_representation
no corpo da classe ereturn self._representation
no__repr__()
método da metaclasse.__repr__
para representarC
. Uma alternativa para ter um_representation
membro é criar uma fábrica de metaclasse que produza uma metaclasse com o apropriado__repr__
(isso pode ser bom se você estiver usando muito isso).fonte
instances
a classe, não para a própria classe.Se você precisar escolher
__repr__
ou__str__
optar pelo primeiro, como a implementação padrão__str__
chama__repr__
quando não foi definido.Exemplo Vector3 personalizado:
Neste exemplo,
repr
retorna novamente uma sequência que pode ser consumida / executada diretamente, enquantostr
é mais útil como uma saída de depuração.fonte
__repr__
vs__str__
esteja correto, isso não responde à pergunta real, que é sobre objetos de classe, não instâncias.A resposta aprovada de Ignacio Vazquez-Abrams está certa. É, no entanto, da geração Python 2. Uma atualização para o Python 3 agora atual seria:
Se você deseja que o código seja executado tanto no Python 2 quanto no Python 3, o módulo seis foi coberto:
Por fim, se você tem uma classe que deseja ter uma repr estática personalizada, a abordagem baseada em classe acima funciona muito bem. Mas se você tiver vários, terá que gerar uma metaclasse semelhante a
MC
cada um, e isso pode ser cansativo. Nesse caso, levar sua metaprogramação um passo adiante e criar uma fábrica de metaclasses torna as coisas um pouco mais limpas:impressões:
A metaprogramação não é algo que você geralmente precisa todos os dias - mas quando você precisa, realmente atinge o ponto!
fonte
Apenas adicionando a todas as boas respostas, minha versão com decoração:
stdout:
Os lados inferiores:
C
sem uma super classe (nãoclass C:
)C
instâncias serão instâncias de alguma derivação estranha; portanto, provavelmente é uma boa ideia adicionar um__repr__
para as instâncias também.fonte