Com o PEP 557, as classes de dados são introduzidas na biblioteca padrão do python.
Eles fazem uso do @dataclass
decorador e devem ser "nomes nomeados mutáveis com padrão", mas não tenho muita certeza de entender o que isso realmente significa e como eles são diferentes das classes comuns.
O que exatamente são as classes de dados python e quando é melhor usá-las?
python
class
python-3.7
python-dataclasses
kingJulian
fonte
fonte
namedtuple
s são imutáveis e não podem ter valores padrão para os atributos, enquanto as classes de dados são mutáveis e podem tê-los.@dataclass
não fará com que o site se desintegre.namedtuples
PODE ter valores padrão. Dê uma olhada aqui: stackoverflow.com/questions/11351032/…Respostas:
As classes de dados são apenas classes regulares que são voltadas para o estado de armazenamento, mais do que contêm muita lógica. Toda vez que você cria uma classe que consiste principalmente de atributos, você cria uma classe de dados.
O que o
dataclasses
módulo faz é facilitar a criação de classes de dados. Ele cuida de muitas placas de caldeira para você.Isso é especialmente importante quando sua classe de dados deve ser lavável; isso requer um
__hash__
método e um__eq__
método. Se você adicionar um__repr__
método personalizado para facilitar a depuração, isso poderá se tornar bastante detalhado:Com
dataclasses
você você pode reduzi-lo a:A mesma classe decorador também pode gerar métodos de comparação (
__lt__
,__gt__
, etc.) e imutabilidade punho.namedtuple
classes também são classes de dados, mas são imutáveis por padrão (além de serem sequências).dataclasses
são muito mais flexíveis a esse respeito e podem ser facilmente estruturados para que possam desempenhar o mesmo papel que umanamedtuple
classe .O PEP foi inspirado no
attrs
projeto , que pode fazer ainda mais (incluindo slots, validadores, conversores, metadados, etc.).Se você quiser ver alguns exemplos, recentemente usei
dataclasses
várias das minhas soluções Advent of Code , consulte as soluções para os dias 7 , 8 , 11 e 20 .Se você quiser usar o
dataclasses
módulo nas versões Python <3.7, poderá instalar o módulo backport (requer 3.6) ou usar oattrs
projeto mencionado acima.fonte
@dataclass
gera aproximadamente o mesmo__init__
método, com umquantity_on_hand
argumento de palavra - chave com valor padrão. Quando você cria uma instância, ele sempre define oquantity_on_hand
atributo da instância. Portanto, meu primeiro exemplo que não seja da classe de dados usa o mesmo padrão para ecoar o que o código gerado pela classe de dados fará.__post_init__
métodoVisão geral
A questão foi abordada. No entanto, esta resposta adiciona alguns exemplos práticos para ajudar no entendimento básico de classes de dados.
namedtuple
e outras .Aqui está o que a última frase significa:
namedtuple
classe ou uma classe regular.Comparado às classes comuns, você economiza principalmente na digitação do código padrão.
Recursos
Esta é uma visão geral dos recursos da classe de dados (TL; DR? Consulte a Tabela Resumo na próxima seção).
O que você ganha
Aqui estão os recursos que você obtém por padrão das classes de dados.
Atributos + Representação + Comparação
Esses padrões são fornecidos configurando automaticamente as seguintes palavras-chave para
True
:O que você pode ativar
Recursos adicionais estão disponíveis se as palavras-chave apropriadas estiverem definidas como
True
.Ordem
Os métodos de ordenação estão agora implementados (sobrecarregando os operadores :)
< > <= >=
, da mesma forma quefunctools.total_ordering
nos testes de igualdade mais fortes.Hashable, Mutable
Embora o objeto seja potencialmente mutável (possivelmente indesejado), um hash é implementado.
Hashable, imutável
Um hash agora está implementado e a alteração do objeto ou a atribuição de atributos não é permitida.
No geral, o objeto é hashable se
unsafe_hash=True
oufrozen=True
.Veja também a tabela lógica de hash original com mais detalhes.
O que você não recebe
Para obter os seguintes recursos, métodos especiais devem ser implementados manualmente:
Desembalar
Otimização
O tamanho do objeto agora é reduzido:
Em algumas circunstâncias,
__slots__
também melhora a velocidade de criação de instâncias e acesso a atributos. Além disso, os slots não permitem atribuições padrão; caso contrário, aValueError
é gerado.Veja mais sobre slots nesta postagem do blog .
Tabela de resumo
+ Esses métodos não são gerados automaticamente e requerem implementação manual em uma classe de dados.
*
__ne__
não é necessário e, portanto, não é implementado .Características adicionais
Pós-inicialização
Herança
Conversões
Converta uma classe de dados em uma tupla ou um ditado, recursivamente :
Limitações
Referências
fonte
A partir da especificação PEP :
O
@dataclass
gerador adiciona métodos para a classe que você de outra forma se define como__repr__
,__init__
,__lt__
, e__gt__
.fonte
Considere esta classe simples
Foo
Aqui está a
dir()
comparação interna. No lado esquerdo está oFoo
sem o decorador @dataclass e à direita está o decorador @dataclass.Aqui está outra diferença, depois de usar o
inspect
módulo para comparação.fonte