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: online/cap12.adoc
+3-3Lines changed: 3 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -31,7 +31,7 @@ Essa mudança foi replicada para as implementações seguintes de `Vector` aqui
31
31
32
32
Vamos começar.
33
33
34
-
=== Vector: Um tipo sequência definido pelo usuário
34
+
=== Vector: tipo sequência definido pelo usuário
35
35
36
36
Nossa((("sequences, special methods for", "Vector implementation strategy")))((("Vector class, multidimensional", "implementation strategy"))) estratégia na implementação de `Vector` será usar composição, não herança. Vamos armazenar os componentes em um array de números de ponto flutuante, e implementar os métodos necessários para que nossa classe `Vector` se comporte como uma sequência plana imutável.
37
37
@@ -153,7 +153,7 @@ Vamos agora implementar o protocolo sequência em `Vector`, primeiro sem suporte
153
153
154
154
155
155
[[sliceable_sequence_sec]]
156
-
=== Vector versão #2: Uma sequência fatiável
156
+
=== Vector versão #2: sequência fatiável
157
157
158
158
Como((("Vector class, multidimensional", "sliceable sequences", id="VCMslice12")))((("sequences, special methods for", "sliceable sequences", id="SSMslice12")))((("slicing", "sliceable sequences", id="Sslseq12")))((("__len__", id="len12")))((("__getitem__", id="getitem12"))) vimos no exemplo da classe `FrenchDeck`, suportar o protocolo de sequência é muito fácil se você puder delegar para um atributo sequência em seu objeto, como nosso array `self._components`. Esses `+__len__+` e `+__getitem__+` de uma linha são um bom começo:
<4> `Vector` não suporta indexação multidimensional, então tuplas de índices ou de fatias geram um erro.((("", startref="getitem12")))((("", startref="len12")))((("", startref="Sslseq12")))((("", startref="SSMslice12")))((("", startref="VCMslice12")))
321
321
322
322
[[vector_dynamic_attrs_sec]]
323
-
=== Vector versão #3: acesso dinâmico a atributos
323
+
=== Vector versão #3: atributos dinâmicos
324
324
325
325
Ao((("Vector class, multidimensional", "dynamic attribute access", id="VCMdyn12")))((("sequences, special methods for", "dynamic attribute access", id="SSMdyn12")))((("__getattr__", id="getattr12")))((("attributes", "dynamic attribute access", id="Adyn12"))) evoluir `Vector2d` para `Vector`, perdemos a habilidade de acessar os componentes do vetor por nome (por exemplo, `v.x`, `v.y`). Agora estamos trabalhando com vetores que podem ter um número grande de componentes. Ainda assim, pode ser conveniente acessar os primeiros componentes usando letras como atalhos, algo como `x`, `y`, `z` em vez de `v[0]`, `v[1]`, and `v[2]`.
Copy file name to clipboardExpand all lines: online/cap24.adoc
+10-5Lines changed: 10 additions & 5 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -516,17 +516,22 @@ Para fazer metaprogramação de classes, precisamos saber quando o interpretador
516
516
[[import_v_runtime_sec]]
517
517
=== O que acontece quando: importação versus execução
518
518
519
-
Programadores Python((("class metaprogramming", "import time versus runtime", id="CMimport24")))((("import time versus runtime"))) falam de "importação" (_import time_) versus "execução" (_runtime_), mas estes termos não têm definições precisas e há uma zona cinzenta entre eles.
519
+
Programadores Python((("class metaprogramming", "import time versus runtime", id="CMimport24")))((("import time versus runtime"))) falam de "momento da importação" (_import time_) versus "momento de execução" (_run time_), mas estes termos não têm definições precisas e há uma zona cinzenta entre eles.
520
520
521
-
Na importação, o interpretador:
521
+
No momento da importação, o interpretador:
522
522
523
-
. Analisa o código-fonte de módulo _.py_ em uma passagem, de cima até embaixo. É aqui que um `SyntaxError` pode ocorrer.
523
+
. Analisa o código-fonte de módulo _.py_ em uma passagem, da primeira até a última linha. É aqui que um `SyntaxError` pode ocorrer.
524
524
. Compila o _bytecode_ a ser executado.
525
525
. Executa o código no nível superior do módulo compilado.
526
526
527
-
Se existir um arquivo _.pyc_ atualizado no `+__pycache__+` local, a análise e a compilação são omitidas, pois o _bytecode_ está pronto para ser executado.
527
+
Se existir um arquivo _.pyc_ atualizado no `+__pycache__+` local,
528
+
a análise e a compilação são omitidas, pois o _bytecode_ está pronto para ser executado.
528
529
529
-
Apesar da análise e a compilação serem definitivamente atividades de "importação", outras coisas podem acontecer durante o processo, pois quase todos os comandos ou instruções no Python são executáveis, no sentido de poderem potencialmente rodar código do usuário e modificar o estado do programa do usuário.
530
+
Apesar da análise e a compilação serem definitivamente atividades de "importação",
531
+
outras coisas podem acontecer durante este processo,
532
+
pois quase todos os comandos ou instruções no Python são executáveis,
533
+
no sentido de poderem potencialmente rodar código do usuário
534
+
e modificar o estado do programa do usuário.
530
535
531
536
Em especial, a instrução `import` não é meramente uma declaraçãofootnote:[Compare com a instrução `import` em Java, que é apenas uma declaração para informar o compilador que determinados pacotes são necessários.], pois na verdade ela executa todo o código no nível superior de um módulo, quando este é importado para o processo pela primeira vez. Importações posteriores do mesmo módulo usarão um _cache_, e então o único efeito será a vinculação dos objetos importados a nomes no módulo cliente. Aquele código no primeiro nível pode fazer qualquer coisa, incluindo ações típicas da "execução", como escrever em um arquivo de log ou conectar-se a um banco de dados.footnote:[Não estou dizendo que é uma boa ideia abrir uma conexão com um banco de dados só porque o módulo foi importado, apenas apontando que isso pode ser feito.]
532
537
Por isso a fronteira entre a "importação" e a "execução" é difusa: `import` pode acionar todo tipo de comportamento de "execução", porque a instrução `import` e a função embutida
0 commit comments