Skip to content

Commit e0e6041

Browse files
committed
vol2: preparação
1 parent 2fb1ea1 commit e0e6041

File tree

9 files changed

+157
-19
lines changed

9 files changed

+157
-19
lines changed

links/FPY.LI.htaccess

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1073,7 +1073,10 @@ RedirectTemp /24-27 https://docs.python.org/3/library/functools.html#functools.t
10731073
RedirectTemp /24-28 https://www.python.org/download/releases/2.2.3/descrintro/
10741074
RedirectTemp /24-29 https://github.com/lihaoyi/macropy
10751075
RedirectTemp /24-30 https://people.eecs.berkeley.edu/~bh/ss-toc2.html
1076-
# content of short.htaccess file created and managed by short.py
1076+
1077+
# chapters
1078+
RedirectTemp /7 https://pythonfluente.com/2/#ch_func_objects
1079+
RedirectTemp /8 https://pythonfluente.com/2/#ch_type_hints_def
10771080

10781081
# appended 2025-05-23 15:12:13
10791082
RedirectTemp /22 https://pythonfluente.com/2/#pattern_matching_case_study_sec

online/cap10.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ include::../code/10-dp-1class-func/strategy.py[tags=STRATEGY_TESTS]
258258
<3> Uma função de promoção diferente é usada aqui e no teste seguinte.
259259

260260

261-
Observe os textos explicativos do <<ex_strategy_tests>>&mdash;não há necessidade
261+
Observe os textos explicativos do <<ex_strategy_tests>>: não há necessidade
262262
de instanciar um novo objeto `promotion` com cada novo pedido: as funções já
263263
estão disponíveis para serem usadas.
264264

online/cap12.adoc

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,9 @@ Quando um `Vector` tem mais de seis componentes, a string produzida por `repr()`
7575
`\...`, como visto na última linha do <<ex_vector_demo>>. Isso é fundamental para qualquer tipo de coleção que possa conter um número grande de itens, pois `repr` é usado na depuração—e você não quer que um único objeto grande ocupe milhares de linhas em seu console ou arquivo de log. Use o módulo `reprlib` para produzir representações de tamanho limitado, como no <<ex_vector_v1>>. O módulo `reprlib` se chamava `repr` no Python 2.7.
7676
====
7777

78-
O <<ex_vector_v1>> lista a implementação de nossa primeira versão de `Vector` (esse exemplo usa como base o código mostrado no pass:[<a data-type="xref" href="#ex_vector2d_v0" data-xrefstyle="select: labelnumber">#ex_vector2d_v0</a>] e no pass:[<a data-type="xref" href="#ex_vector2d_v1" data-xrefstyle="select: labelnumber">#ex_vector2d_v1</a>] do <<ch_pythonic_obj>>).
78+
O <<ex_vector_v1>> lista a implementação de nossa primeira versão de `Vector`
79+
(esse exemplo usa como base o código mostrado no <<ex_vector2d_v0>> e
80+
<<ex_vector2d_v1>> do <<ch_pythonic_obj>>).
7981

8082
[[ex_vector_v1]]
8183
.vector_v1.py: derived from vector2d_v1.py
@@ -520,13 +522,12 @@ class Vector:
520522
# more lines omitted...
521523
----
522524
====
523-
[role="pagebreak-before less_space"]
524525
<1> Importa `functools` para usar `reduce`.
525526
<2> Importa `operator` para usar `xor`.
526527
<3> Não há mudanças em `+__eq__+`; listei-o aqui porque é uma boa prática manter `+__eq__+` e
527528
`+__hash__+` próximos no código-fonte, pois eles precisam trabalhar juntos.
528529
<4> Cria uma expressão geradora para computar sob demanda o _hash_ de cada componente.
529-
<5> Alimenta `reduce` com `hashes` e a função `xor`, para computar o código _hash_ agregado; o terceiro argumento, `0`, é o inicializador (veja o próximo aviso).
530+
<5> Alimenta `reduce` com `hashes` e a função `xor`, para computar o código _hash_ agregado; o terceiro argumento, `0`, é o inicializador (veja o aviso a seguir).
530531

531532
[WARNING]
532533
====
@@ -585,14 +586,22 @@ Uma forma melhor de comparar um `Vector` com outro `Vector` ou iterável seria o
585586
return True # <4>
586587
----
587588
====
588-
<1> Se as `len` dos objetos são diferentes, eles não são iguais.
589-
<2> `zip` produz um gerador de tuplas criadas a partir dos itens em cada argumento iterável. Veja a caixa <<zip_box>>, se `zip` for novidade para você. Em pass:[<img src="callouts/1.png" alt="1"/>], a comparação com `len` é necessária porque `zip` para de produzir valores sem qualquer aviso quando uma das fontes de entrada se exaure.
589+
<1> Se as `len` dos objetos são diferentes, eles não são iguais. Este teste é importante porque o `zip` encerra a iteração
590+
assim que o primeiro argumento é consumido.
591+
<2> `zip` produz um gerador de tuplas criadas a partir dos itens em cada argumento iterável. Veja a caixa <<zip_box>>, se `zip` for novidade para você.
590592
<3> Sai assim que dois componentes sejam diferentes, devolvendo `False`.
591593
<4> Caso contrário, os objetos são iguais.
592594

593595
[TIP]
594596
====
595-
O((("zip() function")))((("functions", "zip() function"))) nome da função `zip` vem de zíper, pois esse objeto físico funciona engatando pares de dentes tomados dos dois lados do zíper, uma boa analogia visual para o que faz `zip(left, right)`. Nenhuma relação com arquivos comprimidos.
597+
O((("zip() function")))((("functions", "zip() function"))) nome da função `zip` vem de zíper,
598+
pois esse objeto físico funciona engatando pares de dentes a partir de duas sequências,
599+
uma boa analogia visual para o que faz `zip(esquerda, direita)`.
600+
Nenhuma relação com arquivos comprimidos. Por padrão, `zip` para de gerar tuplas assim que um de seus argumentos
601+
é consumido até o fim, e ele não levanta uma exceção, a menos que o argumento `strict=True` for passado.
602+
Esse argumento foi introduzido no Python 3.10, mas para preservar a compatibilidade,
603+
o default é `strict=False`.
604+
Isto pode causar falhas silenciosas quando um iterável termina antes dos demais.
596605
====
597606

598607
O <<ex_eq_loop>> é eficiente, mas a função `all` pode produzir a mesma computação de um agregado do loop `for` em apenas uma linha:
@@ -751,7 +760,13 @@ O último aperfeiçoamento a `Vector` foi reimplementar o método `+__format__+`
751760

752761
Como fizemos no <<ch_pythonic_obj>>, muitas vezes aqui olhamos como os objetos padrão de Python se comportam, para emulá-los e dar a `Vector` uma aparência "pythônica".
753762

754-
No <<ch_op_overload>> vamos implemenar vários operadores infixos em `Vector`. A matemática será mais simples que aquela no método `angle()` daqui, mas explorar como os operadores infixos funcionam no Python é uma grande lição sobre design orientado a objetos. Mas antes de chegar à sobrecarga de operadores, vamos parar um pouco de trabalhar com uma única classe e olhar para a organização de múltiplas classes com interfaces e herança, os assuntos dos capítulos pass:[<a data-type="xref" href="#ch_ifaces_prot_abc" data-xrefstyle="select: labelnumber">#ch_ifaces_prot_abc</a>] e pass:[<a data-type="xref" href="ch_inheritance" data-xrefstyle="select: labelnumber">ch_inheritance</a>].
763+
No <<ch_op_overload>> vamos implemenar vários operadores infixos em `Vector`.
764+
A matemática será mais simples que aquela no método `angle()` daqui,
765+
mas explorar como os operadores infixos funcionam no Python
766+
é uma grande lição sobre design orientado a objetos.
767+
Mas antes de chegar à sobrecarga de operadores em uma classe,
768+
vamos estudar a organização de várias classes com interfaces e herança,
769+
os assuntos dos capítulos <<ch_ifaces_prot_abc>> e <<ch_inheritance>>.
755770

756771

757772
=== Para saber mais

online/cap13.adoc

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ Este((("interfaces", "significant changes to")))((("protocols", "significant cha
8181
* <<two_kinds_protocols_sec>> explica as semelhanças e diferenças entre protocolos dinâmicos e estáticos.
8282
* <<defensive_duck_prog_sec>> praticamente reproduz o conteúdo da primeira edição, mas foi atualizada e agora tem um título de seção que enfatiza sua importância.
8383
* <<static_protocols_sec>> é toda nova. Ela se apoia na apresentação inicial em <<protocols_in_fn_sec>> (<<ch_type_hints_def>>).
84-
* Os diagramas de classe de `collections.abc` nas Figuras pass:[<a href="#sequence_uml_repeat" data-type="xref" data-xrefstyle="select:labelnumber">#sequence_uml_repeat</a>], pass:[<a href="#mutablesequence_uml" data-type="xref" data-xrefstyle="select:labelnumber">#mutablesequence_uml</a>], and pass:[<a href="#collections_uml" data-type="xref" data-xrefstyle="select:labelnumber">#collections_uml</a>] foram atualizados para incluir a `Collection` ABC, de Python 3.6.
84+
* Os diagramas de classe de `collections.abc` neste capítulo foram atualizados para incluir a `Collection` ABC, do Python 3.6.
8585

8686
A primeira edição de _Python Fluente_ tinha uma seção encorajando o uso das ABCs `numbers` para goose typing.
8787
Na <<numbers_abc_proto_sec>> eu explico porque, em vez disso, você deve usar protocolos numéricos estáticos do módulo `typing` se você planeja usar checadores de tipos estáticos, ou checagem durante a execução no estilo da goose typing.
@@ -485,7 +485,13 @@ class Lottery:
485485
def draw(self): ...
486486
----
487487
488-
Obviamente, a mera existência de um método chamado `draw`, chamado sem argumentos, [.keep-together]#está longe# de ser suficiente para garantir que dois objetos `x` e `y`, da forma como `x.draw()` e `y.draw()` podem ser chamados, são de qualquer forma intercambiáveis ou abstratamente pass:[equivalentes &mdash;<span class="keep-together"> nada</span>] sobre a similaridade da semântica resultante de tais chamadas pode ser inferido. Na verdade, é necessário um programador inteligente para, de alguma forma, _assegurar_ positivamente que tal equivalência é verdadeira em algum nível.
488+
Obviamente, a mera existência de um método chamado `draw`, sem parâmetros,
489+
não é suficiente para garantir que dois objetos `x` e `y`,
490+
que aceitem as invocações `x.draw()` e `y.draw()`,
491+
são de qualquer forma intercambiáveis ou abstratamente equivalentes—nada
492+
pode ser inferido sobre a similaridade da semântica resultante de tais chamadas.
493+
Na verdade, é necessário um programador inteligente para,
494+
de alguma forma, _assegurar_ positivamente que tal equivalência é verdadeira em algum nível.
489495
490496
Em biologia (e outras disciplinas), este problema levou à emergência (e, em muitas facetas, à dominância) de uma abordagem alternativa à _fenética_, conhecida como ((("cladistics"))) __cladística__ — que baseia as escolhas taxinômicas em características herdadas de ancestrais comuns em vez daquelas que evoluíram de forma independente (o sequenciamento de DNA cada vez mais barato e rápido vem tornando a cladística bastante prática em mais casos).
491497
@@ -672,8 +678,7 @@ Essa ABC não tem nenhum método próprio, mas foi acrescentada no Python 3.6 pa
672678
`Sequence`, `Mapping`, `Set`::
673679
Esses são os principais tipos de coleções imutáveis, e cada um tem uma subclasse mutável.
674680
Um diagrama detalhado de `MutableSequence` é apresentado em <<mutablesequence_uml>>;
675-
para `MutableMapping` e `MutableSet`, veja as Figuras pass:[<a data-type="xref" href="#mapping_uml" data-xrefstyle="select: labelnumber">#mapping_uml</a>] e
676-
pass:[<a data-type="xref" href="#set_uml" data-xrefstyle="select: labelnumber">#set_uml</a>] em <<ch_dicts_sets>>.
681+
para `MutableMapping` e `MutableSet`, veja a <<mapping_uml>> e a <<set_uml>> em <<ch_dicts_sets>>.
677682

678683
`MappingView`::
679684
No Python 3, os objetos retornados pelos métodos de mapeamentos `.items()`, `.keys()`, e `.values()`
@@ -756,11 +761,14 @@ Os métodos concretos são:
756761
`.inspect()`:: Retorna uma `tuple` construída a partir dos itens atualmente no container, sem modificar o conteúdo (a ordem interna não é preservada).
757762

758763
A <<tombola_uml>> mostra a ABC `Tombola` e três implementações concretas.
764+
Vale notar que _registered_ (registarada) e _virtual subclass_ (subclasse virtual)
765+
não são termos da UML padrão, mas representam uma relação de classe específica de Python,
766+
como veremos na <<virtual_subclass_sec>>.
759767

760768
[role="width-80"]
761769
[[tombola_uml]]
762-
763-
.Diagrama UML para uma ABC e três subclasses. O nome da ABC `Tombola` e de seus métodos abstratos estão escritos em _itálico_, segundo as convenções da UML. A seta tracejada é usada para implementações de interface - as estou usando aqui para mostrar que `TomboList` implementa não apenas a interface `Tombola`, mas também está registrada como uma _subclasse virtual_ de `Tombola` - como veremos mais tarde nesse capítulo.pass:[<span data-type="footnote"><span class="roman">«registrada» and «subclasse virtual» não são termos da UML padrão. Estão sendo usados para representar uma relação de classe específica de Python.</span></span>]
770+
.Diagrama UML para uma ABC e três subclasses. O nome da ABC `Tombola` e de seus métodos abstratos estão escritos em _itálico_, segundo as convenções da UML. A seta tracejada indica que `TomboList` implementa a interface `Tombola`, e também está registrada como _subclasse virtual_.
771+
`TomboList` também está registrada como uma _subclasse virtual_ de `Tombola`.
764772
image::../images/flpy_1305.png[UML for Tombola]
765773

766774
O <<ex_tombola_abc>> mostra a definição da ABC `Tombola`.
@@ -1861,13 +1869,16 @@ Beazley and Jones's pass:[<em><a class="orm:hideurl" href="https://fpy.li/pycook
18611869
tem uma seção sobre como definir uma ABC (Recipe 8.12).
18621870
O livro foi escrito antes de Python 3.4,
18631871
então eles não usam a atual sintaxe preferida para declarar ABCs, criar uma subclasse de `abc.ABC`
1864-
(em vez disso, eles usam a palavra-chave `metaclass`, da qual só vamos precisar mesmo em<<ch_class_metaprog>>).
1872+
(em vez disso, eles usam a palavra-chave `metaclass`, da qual só vamos precisar mesmo em<<ch_class_metaprog>>).
18651873
Tirando esse pequeno detalhe, a receita cobre os principais recursos das ABCs muito bem.
18661874

18671875
_The Python Standard Library by Example_ by Doug Hellmann (Addison-Wesley),
18681876
tem um capítulo sobre o módulo `abc`.
1869-
Ele também esta disponível na web, no excelente site do Doug https://fpy.li/13-51[_PyMOTW_&mdash;Python Module of the Week] (EN).
1870-
Hellmann também usa a declaração de ABC no estilo antigo:`PluginBase(metaclass=abc.ABCMeta)` em vez do mais simples `PluginBase(abc.ABC)`, disponível desde o Python 3.4.
1877+
Ele também esta disponível na web, em
1878+
https://fpy.li/13-51[_PyMOTW—Python Module of the Week_].
1879+
Hellmann usa a declaração de ABC no estilo
1880+
antigo:`PluginBase(metaclass=abc.ABCMeta)`
1881+
em vez de `PluginBase(abc.ABC)`, suportada desde o Python 3.4.
18711882

18721883
Quando usamos ABCs, herança múltipla não é apenas comum mas praticamente inevitável,
18731884
porque cada uma das ABCs fundamentais de coleções (`Sequence`, `Mapping`, `Set`)

vol1/vol1.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
= Python Fluente: 2ª edição, volume 1&#x3a; dados e funções
1+
= Python Fluente: 2ª edição, volume 1&#x3a; Dados e Funções
22
:doctype: book
33
:media: prepress
44
:hide-uri-scheme:

vol1/xilo_calango_tc_flat.png

-3.57 MB
Binary file not shown.

vol2/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
vol2.pdf

vol2/Copyright.adoc

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
[colophon%discrete%notitle%nonfacing,toclevels=0]
2+
= Copyright
3+
4+
Tradução em português autorizada da edição em inglês da obra _Fluent Python, 2nd Edition_ ISBN 978-1-492-05635-5
5+
© 2022 Luciano Ramalho.
6+
Esta tradução é publicada e vendida com a permissão da O'Reilly Media, Inc.,
7+
detentora dos direitos para publicação e venda desta obra.
8+
9+
© 2025 Luciano Ramalho. +
10+
_Python Fluente, 2a edição_ está publicado sob a licença
11+
_Atribuição-NãoComercial-CompartilhaIgual 4.0 Internacional_
12+
«CC BY-NC-SA 4.0» [.small]#&#91;fpy.li/ccby&#93;#. +
13+
O autor mantém uma versão online em https://PythonFluente.com.
14+
15+
Autor: Luciano Ramalho +
16+
Título: Python Fluente, 2ª edição, volume 2: classes e protocolos +
17+
Primeira edição: 2015 +
18+
Edição atual: setembro/2025 +
19+
{revisao}ª revisão: `pyfl-vol2-rev{revisao}.pdf`
20+
21+
Tradução: Paulo Candido de Oliveira Filho
22+
23+
Ilustração de capa: Thiago Castor (xilogravura "Calango") +
24+
Design de Capa: Luciano Ramalho, Zander Catta Preta @ Z•Edições +
25+
Design de Miolo: Luciano Ramalho, com Aciidoctor
26+
27+
Publisher: Heinar Maracy @ Z•Edições
28+
29+
----
30+
Dados Internacionais de Catalogação na Publicação (CIP)
31+
Câmara Brasileira do Livro, SP, Brasil
32+
33+
Ramalho, Luciano.
34+
35+
Python Fluente, 2a edição, volume 2: classes e protocolos /
36+
Luciano Ramalho - São Paulo, SP - Z.Edições, 2025.
37+
402 f.; il.; 17 cm × 24 cm
38+
39+
ISBN: XXX-XX-XXXXXX-X-X
40+
1.Informática. 2.Linguagem de Programação. 3.Python.
41+
4.Curso de Programação Python.
42+
43+
I. Título
44+
45+
CDD 004.43
46+
----

vol2/vol2.adoc

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
= Python Fluente: 2ª edição, volume 2&#x3a; Classes e Protocolos
2+
:doctype: book
3+
:media: prepress
4+
:hide-uri-scheme:
5+
:pdf-page-size: [17cm, 24cm]
6+
:source-highlighter: rouge
7+
:author: Luciano Ramalho
8+
:lang: pt_BR
9+
:language: asciidoctor
10+
:xrefstyle: short
11+
:sectnums:
12+
:sectnumlevels: 4
13+
:sectlinks:
14+
:data-uri:
15+
:!chapter-signifier:
16+
include::../print/attrib-print-pt-br.adoc[]
17+
:toclevels: 2
18+
:toc: macro
19+
:revisao: 8
20+
21+
include::Copyright.adoc[]
22+
23+
[dedication%notitle%discrete,toclevels=0]
24+
= Dedicatória
25+
__Para Marta, com todo o meu amor.__
26+
27+
toc::[]
28+
29+
= Parte II.b: Funções como objetos
30+
31+
[NOTE]
32+
====
33+
Esta versão impressa do _Python Fluente, segunda edição_
34+
foi publicada em três volumes, com oito capítulos por volume.
35+
36+
A Parte II ficou dividida entre os Volumes 1 e 2.
37+
38+
Os capítulos 9 e 10 estão neste Volume 2.
39+
40+
A Parte II.a está no Volume 1, e também na Web:
41+
42+
«Capítulo 7—Funções como objetos de primeira classe» [.small]#&#91;fpy.li/7&#93;#
43+
44+
«Capítulo 8—Padrões de projeto com funções» [.small]#&#91;fpy.li/8&#93;#
45+
46+
47+
====
48+
49+
include::../online/cap09.adoc[]
50+
include::../online/cap10.adoc[]
51+
52+
[[data_structures_part]]
53+
= Parte III: Classes e protocolos
54+
:sectnums:
55+
56+
include::../online/cap11.adoc[]
57+
include::../online/cap12.adoc[]
58+
include::../online/cap13.adoc[]
59+
include::../online/cap14.adoc[]
60+
include::../online/cap15.adoc[]
61+
include::../online/cap16.adoc[]
62+

0 commit comments

Comments
 (0)