You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: capitulos/cap01.adoc
+47-21Lines changed: 47 additions & 21 deletions
Original file line number
Diff line number
Diff line change
@@ -3,7 +3,11 @@
3
3
4
4
[quote, Jim Hugunin, criador do Jython, co-criador do AspectJ, e arquiteto do .Net DLR—Dynamic Language Runtime]
5
5
____
6
-
O senso estético de Guido para o design de linguagens é incrível. Conheci muitos projetistas capazes de criar linguagens teoricamente lindas, que ninguém jamais usaria. Mas Guido é uma daquelas raras pessoas capaz de criar uma linguagem só um pouco menos teoricamente linda que, por isso mesmo, é uma delícia para programar.
6
+
O senso estético de Guido para o design de linguagens é incrível.
7
+
Conheci muitos projetistas capazes de criar linguagens teoricamente lindas,
8
+
que ninguém jamais usaria.
9
+
Mas Guido é uma daquelas raras pessoas capaz de criar uma linguagem só um pouco menos teoricamente linda que,
pois é uma introdução ao Modelo de Dados de Python, que é muito estável.
86
90
As mudanças mais significativas foram:
87
91
88
-
* Métodos especiais que suportam programação assíncrona e outras novas funcionalidades foram acrescentados às tabelas em <<overview_special_methods>>.
92
+
* Métodos especiais que suportam programação assíncrona e outras novas funcionalidades
93
+
foram acrescentados às tabelas em <<overview_special_methods>>.
89
94
90
-
* A <<collection_uml>>, mostrando o uso de métodos especiais em <<collection_api>>, incluindo a classe base abstrata `collections.abc.Collection`, introduzida n Python 3.6.
95
+
* A <<collection_uml>>, mostrando o uso de métodos especiais em <<collection_api>>,
96
+
incluindo a classe base abstrata `collections.abc.Collection`, introduzida no Python 3.6.
91
97
92
98
Além disso, aqui((("f-string syntax", "benefits of"))) e por toda essa segunda edição,
93
-
adotei a sintaxe _f-string_, introduzida n Python 3.6,
99
+
adotei a sintaxe _f-string_, introduzida no Python 3.6,
94
100
que é mais legível e muitas vezes mais conveniente que as notações de formatação de strings mais antigas:
@@ -500,7 +506,7 @@ Programadores com experiência anterior em linguagens que contém o método `toS
500
506
tendem a implementar `+__str__+` e não `+__repr__+`.
501
507
Se você for implementar apenas um desses métodos especiais, escolha `+__repr__+`.
502
508
503
-
https://fpy.li/1-5["What is the difference between `+__str__+` and `+__repr__+` in Python?" (_Qual a diferença entre `+__str__+` e `+__repr__+` em Python?_)] (EN)
509
+
https://fpy.li/1-5["What is the difference between `+__str__+` and `+__repr__+` ino Python?" (_Qual a diferença entre `+__str__+` e `+__repr__+` em Python?_)] (EN)
504
510
é uma questão no Stack Overflow com excelentes contribuições dos pythonistas
505
511
Alex Martelli e Martijn Pieters.((("", startref="repr01")))
506
512
====
@@ -574,7 +580,7 @@ mostrando como elas são criadas a partir de métodos especiais.
574
580
image::../images/flpy_0102.png[Diagram de classes UML com todas as superclasses e algumas subclasses de `abc.Collection`]
575
581
576
582
Cada uma das ABCs no topo da hierarquia tem um único método especial.
577
-
A ABC `Collection` (introduzida n Python 3.6) unifica as três interfaces essenciais,
583
+
A ABC `Collection` (introduzida no Python 3.6) unifica as três interfaces essenciais,
@@ -624,7 +630,8 @@ Para ter uma visão geral do que está disponível, veja tabelas a seguir.
624
630
A <<special_names_tbl>> mostra nomes de métodos especiais, excluindo aqueles usados para implementar
625
631
operadores infixos ou funções matemáticas fundamentais como `abs`.
626
632
A maioria desses métodos será tratado ao longo do livro, incluindo as adições mais recentes:
627
-
métodos especiais assíncronos como `+__anext__+` (acrescentado n Python 3.5), e o método de personalização de classes, `+__init_subclass__+` (d Python 3.6).
633
+
métodos especiais assíncronos como `+__anext__+` (acrescentado no Python 3.5),
634
+
e o método de configuração de classes, `+__init_subclass__+` (do Python 3.6).
628
635
629
636
////
630
637
PROD: Please make sure funcion names such as divmod() and __truediv__ are not
@@ -657,7 +664,7 @@ I tried to use keep-together in <special_operators_tbl> but it was rendering a 0
657
664
Operadores infixos e numéricos são suportados pelos métodos especiais listados na
658
665
<<special_operators_tbl>>.
659
666
Aqui os nomes mais recentes são `+__matmul__+`, `+__rmatmul__+`, e `+__imatmul__+`,
660
-
adicionados n Python 3.5 para suportar o uso de `@` como operador de multiplicação de matrizes,
667
+
adicionados no Python 3.5 para suportar o uso de `@` como operador de multiplicação de matrizes,
661
668
como veremos no <<ch_op_overload>>.((("special methods", "special method names and symbols for operators")))
662
669
663
670
[[special_operators_tbl]]
@@ -677,7 +684,8 @@ como veremos no <<ch_op_overload>>.((("special methods", "special method names a
677
684
678
685
[NOTE]
679
686
====
680
-
Python invoca um método especial de operador reverso no segundo argumento quando o método especial correspondente não pode ser usado no primeiro operando.
687
+
Python invoca um método especial de operador reverso no segundo argumento
688
+
quando o método especial correspondente não pode ser usado no primeiro operando.
681
689
Atribuições aumentadas são atalho combinando um operador infixo com uma atribuição de variável, por exemplo `a += b`.
682
690
683
691
O <<ch_op_overload>> explica em detalhes os operadores reversos e a atribuição aumentada.((("", startref="PDMspmtov01")))
@@ -694,35 +702,49 @@ Nenhum método é chamado para os objetos embutidos do CPython: o tamanho é sim
694
702
Obter o número de itens em uma coleção é uma operação comum, e precisa funcionar de forma eficiente para tipos tão básicos e diferentes como
695
703
`str`, `list`, `memoryview`, e assim por diante.
696
704
697
-
Em outras palavras, `len` não é chamado como um método porque recebe um tratamento especial como parte do Modelo de Dados de Python, da mesma forma que `abs`.
698
-
Mas graças ao método especial pass:[<code>__len__</code>], também é possível fazer `len` funcionar com nossos objetos personalizados.
705
+
Em outras palavras, `len` não é chamado como um método porque recebe um tratamento especial como parte do Modelo de Dados de Python,
706
+
da mesma forma que `abs`.
707
+
Mas graças ao método especial pass:[<code>__len__</code>], também é possível fazer `len` funcionar com objetos nossas classes.
699
708
Isso é um compromisso justo entre a necessidade de objetos embutidos eficientes e a consistência da linguagem.
700
709
Também de "O Zen de Python": "Casos especiais não são especiais o bastante para quebrar as regras."
701
710
702
711
703
712
[NOTE]
704
713
====
705
-
Pensar em `abs` e `len` como operadores unários nos deixa mais inclinados a perdoar seus aspectos funcionais, contrários à sintaxe de chamada de método que esperaríamos em uma linguagem orientada a objetos.
706
-
De fato, a linguagem ABC—uma ancestral direta de Python, que antecipou muitas das funcionalidades desta última—tinha o operador `#`, que era o equivalente de `len` (se escrevia `#s`).
707
-
Quando usado como operador infixo, `x#s` contava as ocorrências de `x` em `s`, que em Python obtemos com `s.count(x)`, para qualquer sequência `s`.
714
+
Pensar em `abs` e `len` como operadores unários nos deixa mais inclinados a perdoar seus aspectos funcionais,
715
+
contrários à sintaxe de chamada de método que esperaríamos em uma linguagem orientada a objetos.
716
+
De fato, Python herdou muito de sua sintaxe e estruturas de dados da linguagem ABC,
717
+
onde existe o operador `#`,
718
+
que equivale ao `len`: em ABC, `len(s)` escreve-se `#s`.
719
+
Quando usado como operador infixo,
720
+
`x#s` conta as ocorrências de `x` em `s`,
721
+
que em Python obtemos com `s.count(x)`,
722
+
para qualquer sequência `s`.
708
723
====
709
724
710
725
[role="pagebreak-before less_space"]
711
726
=== Resumo do capítulo
712
727
713
-
Ao((("Python Data Model", "overview of"))) implementar métodos especiais, seus objetos podem se comportar como tipos embutidos, permitindo o estilo de programação expressivo que a comunidade considera pythônico.
728
+
Ao((("Python Data Model", "overview of"))) implementar métodos especiais,
729
+
seus objetos podem se comportar como tipos embutidos,
730
+
permitindo o estilo de programação expressivo que a comunidade considera pythônico.
714
731
715
-
Uma exigência básica para um objeto em Python é fornecer strings representando a si mesmo que possam ser usadas, uma para depuração e registro (_log_), outra para apresentar aos usuários finais. É para isso que os métodos especiais `+__repr__+` e `+__str__+` existem no modelo de dados.
732
+
Uma exigência básica para um objeto em Python é fornecer strings representando a si mesmo que possam ser usadas,
733
+
uma para depuração e registro (_log_), outra para apresentar aos usuários finais.
734
+
É para isso que os métodos especiais `+__repr__+` e `+__str__+` existem no modelo de dados.
716
735
717
736
Emular sequências, como mostrado com o exemplo do `FrenchDeck`, é um dos usos mais comuns dos métodos especiais.
718
737
Por exemplo, bibliotecas de banco de dados frequentemente devolvem resultados de consultas na forma de coleções similares a sequências.
719
738
Tirar o máximo proveito dos tipos de sequências existentes é o assunto do <<ch_sequences>>.
720
739
Como implementar suas próprias sequências será visto na <<ch_seq_methods>>,
721
740
onde criaremos uma extensão multidimensional da classe `Vector`.
722
741
723
-
Graças à sobrecarga de operadores, Python oferece uma rica seleção de tipos numéricos, desde os tipos embutidos até `decimal.Decimal` e `fractions.Fraction`,
742
+
Graças à sobrecarga de operadores, Python oferece uma rica seleção de tipos numéricos,
743
+
desde os tipos embutidos até `decimal.Decimal` e `fractions.Fraction`,
724
744
todos eles suportando operadores aritméticos infixos.
725
-
As bibliotecas de ciência de dados _NumPy_ suportam operadores infixos com matrizes e tensores. A implementação de operadores—incluindo operadores reversos e atribuição aumentada—será vista no <<ch_op_overload>>, usando melhorias do exemplo `Vector`.
745
+
As bibliotecas de ciência de dados _NumPy_ suportam operadores infixos com matrizes e tensores.
746
+
A implementação de operadores—incluindo operadores reversos e atribuição aumentada—será vista no <<ch_op_overload>>,
747
+
usando melhorias do exemplo `Vector`.
726
748
727
749
Também veremos o uso e a implementação da maioria dos outros métodos especiais do Modelo de Dados de Python ao longo deste livro.
728
750
@@ -761,9 +783,11 @@ explica o conceito de um protocolo de metaobjetos, do qual o Modelo de Dados de
761
783
Modelo de dados ou modelo de objetos?
762
784
763
785
764
-
Aquilo((("Soapbox sidebars", "data model versus object model")))((("Python Data Model", "Soapbox discussion"))) que a documentação de Python chama de "Modelo de Dados de Python", a maioria dos autores diria que é o "Modelo de objetos de Python"
786
+
Aquilo((("Soapbox sidebars", "data model versus object model")))((("Python Data Model", "Soapbox discussion")))
787
+
que a documentação de Python chama de "Modelo de Dados de Python", a maioria dos autores diria que é o "Modelo de objetos de Python"
765
788
766
-
O _Python in a Nutshell_, 3rd ed. de Martelli, Ravenscroft, e Holden, e o _Python Essential Reference_, 4th ed., de David Beazley são os melhores livros sobre o Modelo de Dados de Python, mas se referem a ele como o "modelo de objetos."
789
+
O _Python in a Nutshell_, 3rd ed. de Martelli, Ravenscroft, e Holden, e o _Python Essential Reference_, 4th ed.,
790
+
de David Beazley são os melhores livros sobre o Modelo de Dados de Python, mas se referem a ele como o "modelo de objetos."
767
791
Na Wikipedia, a primeira definição de
768
792
https://fpy.li/1-10["modelo de objetos"]
769
793
(EN) é: "as propriedades dos objetos em geral em uma linguagem de programação de computadores específica."
@@ -776,7 +800,9 @@ mais relevante para nossas discussões.
776
800
Métodos de "trouxas"
777
801
778
802
https://fpy.li/1-11[_The Original Hacker's Dictionary_ (_Dicionário Hacker Original_)]
779
-
(EN) define ((("Soapbox sidebars", "magic methods")))((("magic methods"))) _mágica_ como "algo ainda não explicado ou muito complicado para explicar" ou "uma funcionalidade, em geral não divulgada, que permite fazer algo que de outra forma seria impossível."
803
+
(EN) define ((("Soapbox sidebars", "magic methods")))((("magic methods"))) _mágica_ como
804
+
"algo ainda não explicado ou muito complicado para explicar" ou "uma funcionalidade,
805
+
em geral não divulgada, que permite fazer algo que de outra forma seria impossível."
780
806
781
807
Ruby tem o equivalente aos métodos especiais, chamados de _métodos mágicos_ naquela comunidade.
782
808
Alguns na comunidade Python também adotam esse termo.
0 commit comments