{
  "path": "/um-rapido-tour-sobre-as-classes-de-dados-do-python-3.7.html",
  "site": "at://did:plc:3272gdrjsuikiff7qsgokgas/site.standard.publication/3mjaxtes2yf2v",
  "tags": [
    "pt",
    "Python",
    "Dev"
  ],
  "$type": "site.standard.document",
  "title": "Um rápido tour sobre as classes de dados do Python 3.7",
  "publishedAt": "2018-02-26T00:00:00.000Z",
  "textContent": "---\n\n_Tradução do post de autoria de Anthony Shaw, publicado originalmente no Hacker Noon. Muito obrigado a eles (e especialmente ao David Smooke) por autorizar a tradução. Obrigado também ao Guido Percú pela revisão da tradução._\n\n---\n\nUma nova funcionalidade do Python 3.7 são as “classes de dados“ (em inglês, _data classes_). Classes de dados são uma forma de automatizar a geração de código para classes que guardam múltiplas propriedades.\n\nElas tem ainda a vantagem de utilizar as anotações de tipos do Python 3:\n\nClasses de dados vem no novo módulo padrão do Python 3.7, dataclasses, e tem duas coisas importantes que você vai precisar saber.\n\n1. O decorador dataclass, para decorar uma classe de dados\n1. O método field, para configurar campos\n\nPadrões dos métodos mágicos\n\nPor padrão qualquer classe de dados vai implementar __init__, __repr__, __str__ e __eq__ para você.\n\nO método __init__ vai ter argumentos nomeados com as mesmas assinaturas de tipo da classe.\n\nO método __eq__ vai comparar os atributos em ordem.\n\nTodos os campos são declarados no topo da classe e as anotações de tipo são obrigatórias.\n\nEsse método __init__ vai ter uma assinatura (field_a: int, field_b: str) -> None. Você pode conferir isso digitando print(inspect.signature(example.__init__)).\n\nIndução de tipo\n\nÉ importante destacar que as anotações de tipo são apenas dicas. Ou seja, passando tipos diferentes não faz o programa dar erro ou tentar convertê-lo.\n\nComo a declaração dos tipos é obrigatória (caso contrário o campo é ignorado), se você não quiser especificar um tipo, use o tipo Any do módulo typing.\n\nMutabilidade\n\nO decorador da classe de dados tem o argumento frozen, que é False por padrão. Se especificado, os campos serão “_congelados_”, ou seja, serão apenas para leitura e se eq for True, que é o padrão, então o método mágico __hash__ será implementado e as instâncias do objeto vão ser _hashable_, assim você pode usá-las como chaves de dicionários ou em um set.\n\nCampos personalizados\n\nO tipo principal em uma classe de dados é o tipo Field, que pertence ao módulo dataclass.\n\nPor padrão, apenas criando um atributo da classe já instanciará um Field como demonstrado nos exemplos anteriores.\n\nSe você precisa de um comportamento personalizado, você pode usar a fábrica de campos do módulo dataclasses.\n\nOs parâmetros para field() são:\n\n default: Se fornecido, esse será o valor padrão para esse campo. Isso é necessário pois a chamada do próprio field substitui o valor padrão de um argumento posicional.\n default_factory: Um objeto que pode ser chamado sem argumentos que será chamado quando um valor padrão for necessário para esse campo.\n init: Incluído como um parâmetro para o método __init__.\n repr: Incluído na _string_ retornada pelo método __repr__.\n compare: Incluído nos métodos de equidade e comparação (__eq__, __gt__, etc.).\n hash: Incluído no método __hash__.\n\n_Tem ainda um outro argumento, metadata que não está em uso por enquanto._\n\nDe forma similar aos argumentos nomeados, campos com valores padrão devem ser declarados por último.\n\nDemonstrando a fábrica com valor padrão:\n\nProcessamento pós-init\n\nVocê pode declarar um método __post_init__ que será executado após o __init__ gerado automaticamente.\n\nHerança\n\nHerança acontece normalmente. Você precisa utilizar dataclass para a classe que herda e para a classe que serve como base.\n\nNo entanto, como você não pode declarar um campo sem valor padrão depois de declarar um campo que tem um valor padrão, você não pode misturar campos com e sem valor padro nas classe base e nas que herdam dela.\n\nEsse exemplo quebra com TypeError: non-default argument ‘field_a’ follows default argument.\n\nIsso é bem irritante e provavelmente vai fazer com que as pessoas não usem muito herança ou campos com valores padrão.\n\nDe toda forma, essa é uma ótima funcionalidade e eu provavelmente vou parar de usar attrs quando Python 3.7 for lançado.",
  "canonicalUrl": "https://cuducos.me/um-rapido-tour-sobre-as-classes-de-dados-do-python-3.7.html"
}