Escolar Documentos
Profissional Documentos
Cultura Documentos
https://docs.python.org/3/reference/lexical_analysis.html
https://docs.python.org/3/reference/datamodel.html
Quando essa live acabar
Você é OBRIGADO a assistir as lives:
● 32 - collections.abc / Collections #5
● Rapidinha Pythonica #3 - Programação declarativa com Python
● 43 - Gerenciadores de contexto
● 59 - Objetos assíncronos
Sobrecarga de operadores
“Operadores aritméticos são frequentemente usados para mais de um propósito.
Por exemplo, + geralmente é usado para especificar adição de inteiros e adição
de ponto flutuante. Algumas linguagens também o usam para catenação de
strings.
2+2
2 // 2
Operadores infixos
Operadores infixos são aqueles que ficam “entre” objetos.
Operador infixo
2+2
2 // 2
Operadores infixos
Existe uma gama grande de operadores infixos em Python
https://docs.python.org/3/reference/lexical_analysis.html#operators
Operadores infixos
E pra cada um desses operadores temos um dunder específico
+ __add__ == __eq__
/ __floordiv__ % __mod__
Exemplo:
MeuTipo() + 2 + 10
MeuTipo.__add__(2) ????.__add__(10)
Agora você está grandinho pra saber
Somável() + 2 + 10
Somável.__add__(2)
None.__add__(10)
Agora você está grandinho pra saber
Agora você está grandinho pra saber
Operadores infixos
Tá, ok. Era só isso? NÃO. Em python tem uma peculiaridade interessante. A
comutatividade não é verdadeira por definição. Hã?
MeuTipo() + 2 2 + MeuTipo()
2.__add__(MeuTipo())
MeuTipo.__add__(2)
Resultad TypeError
o
Operadores infixos
Ok, vamos tentar entender a ordem em que o python resolve as expressões
O ivos le
na be tip
s
t
2 + MeuTipo()
tip nã r
sa eu
MeuTipo() + 2
os o
m
m o
t ipo r
u le s
Me be tivo
sa na
s
it po
2.__add__(MeuTipo())
MeuTipo.__add__(2)
Resultad TypeError
o
Operadores infixos
+ __add__ __radd__
- __sub__ __rsub__
* __mul__ __rmul__
/ __floordiv__ __rfloordiv__
// __truediv__ __rtruediv__
== __eq__ ?
!= __ne__ ?
<= __le__ ?
>= __ge__ ?
< __lt__ ?
> __gt__ ?
Operadores infixos (sem reverso)
Métodos de comparação não tem inverso, pois eles já têm a inversão
== __eq__ __ne__
!= __ne__ __eq__
Operadores inplace são infixos também, mas ele tem um propósito um pouco
diferente.
Obj() += 5
Operadores inplace
inplace poderia ser traduzido com “No lugar”. Ou seja, a expressão não tem um
resultado, ela modifica o objeto que tem o operado.
Operadores inplace
Operador inplace
Por boas práticas operadores inplace nunca devem
retornar nada, CLARO, estão modificando o próprio
+= __iadd__
objeto
-= __isub__
*= __imul__
/= __ifloordiv__
//= __itruediv__
<<= __ilshift__
>>= __irshift__
Tudo Junto, agora!