5
respostas

Ducktyping e data model, o que é ?

Professor boa tarde. Uma dúvida, no caso a utilização do getitem é uma composição ? Eu já estudei um pouco de Java, mas ainda não está muito claro isso. No caso a classe pegou um comportamento de um objeto sem ser ou ter esse objeto ? No caso só de implementar o método getitem pro python ele já pode ser considerado um lista ? essa conceito do ducktyping e data model está um pouco confuso, pode explicar melhor ?

5 respostas

Oi Daniel, tudo certo?

Mesmo não existindo uma palavra reservada no Python para interface, toda classe tem uma interface que são seus métodos públicos. Outra definição complementar é que uma interface é o subconjunto dos métodos públicos de um objeto que lhe permitem desempenhar um papel específico - o que chamamos também de protocolo. E os protocolos são independentes de herança. Por isso deve causar uma certa confusão aqui quando você fala " pegou um comportamento de um objeto sem ser ou ter esse objeto". É assim que são as interfaces quando adotamos o duck typing.

O método especial __getitem__ desempenha um papel específico e todo objeto que possui uma implementação deste pode ser considerado "iterável". O mesmo vale para o método __iter__ e você pode ler mais a respeito na PEP234: https://www.python.org/dev/peps/pep-0234/

Se uma classe implementa __getitem__ e nada mais, somos capazes de fazer uma iteração por ela e o operador in funciona (já que ele exige esse comportamento para funcionar).

Data Model

Um modelo de dados (ou datamodel ) é um modelo abstrato que organiza elementos de dados e padroniza como eles se relacionam entre si. Todos os dados em um programa Python são representados por objetos ou por relações entre objetos. Uma classe pode implementar certas operações que são invocadas por uma sintaxe especial (como operações aritméticas), definindo métodos com nomes especiais (como o __getitem__). Essa é a abordagem do Python à sobrecarga de operadores, permitindo que as classes definam seu próprio comportamento em relação aos operadores da linguagem.

Duck Typing

Uma característica de linguagens dinâmicas como Python é a chamada Duck Typing, a tipagem de pato. É uma característica de um sistema de tipos em que a semântica de uma classe é determinada pela sua capacidade de responder a alguma mensagem, ou seja, responder a determinado atributo (ou método). O exemplo canônico (e a razão do nome) é o teste do pato: se ele se parece com um pato, nada como um pato e grasna como um pato, então provavelmente é um pato. O Duck Typing é um estilo de programação que não procura o tipo do objeto para determinar se ele tem a interface correta. Ao invés disso, o método ou atributo é simplismente chamado ou usado ('se parece como um pato e grasna como um pato, então deve ser um pato').

Se ainda permaneceu alguma dúvida é só postar aqui novamente! Espero ter ajudado e bons estudos!

Oii Thais, primeiro excepcional sua explicação, muito boa. Então a grosso modo, o ducktyping é como se fosse uma "interface" que eu não sou obrigado a implementar todos os métodos e quando implementado eu ganho o poder de ser um objeto considerado uma outra classe, como pro exemplo nesse caso do getintem eu implemento esse método e mesmo não recebendo herença de um list meu objeto implementa um método de um list e por fazer isso ele pode assumir um papel de list também, seria isso ?

Realmente o python é um "linguajão" da por... rsrs. Muito obrigado pela explicação, aguardo reposta.

Na verdade, é mais correto chamar o Duck Typing como um estilo/técnica de programar em linguagens dinâmicas em que não importa o tipo de um objeto mas se ele á capaz de responder a um determinado método.

No caso em que um objeto implementa __getitem__, quer dizer que o objeto implementa um protocolo específico (ele passa a ser iterável) e isso não quer dizer que ele seja uma list. Apenas quer dizer que tanto seu objeto que implementa __getitem__ e a list são iteráveis e se comportam como tal, nada mais. Para ser considerado um list é necessário mais do que implementar apenas o __getitem__.

O método __str__, por exemplo, é esperado que retorne uma representação do objeto em forma de string. Nada impede de fazermos outras coisas dentro do método como deletar algum conteúdo, fazer algum cálculo, etc... ao invés de retornarmos apenas a string. Mas há um entendimento prévio comum do que este método deve fazer e está presente na documentação do Python. Este é um exemplo onde o contrato semântico é descrito em um manual, ou seja, o protocolo (como aquilo que define o que é um iterável). Algumas linguagens de tipagem estática, como Java, possuem interfaces em sua biblioteca padrão e podem garantir este contrato em tempo de compilação (e um objeto que realmente implementa outra classe que é uma interface).

Não sei se ficou claro agora, mas continue perguntando caso não tenha entendido.

Boa Tarde Pessoal, tudo bem?

Aproveitando o gancho da explicação, eu poderia definir que o Duck Typing é uma forma de forma/técnica de programar na qual não me interessa saber se o tipo do objeto mas se ele possui as características necessárias para tal.

Está correto? Posso usar essa definição?

Obrigado

Boa noite Thiago. Cara depois da bela explicação da Thais Thomazini acredito que sim. Não sei você mas eu que já viajei um pouco no mundo do Java fico fascinado com a simplicidade do python, a dificuldade é abstrair esses novos conceitos rsrs.