Você está na página 1de 39

Zander - Flamboyant (2016)

Live de Python #65


Programação orientada a objetos #4
Ajude a Live de Python
apoia.se/livedepython
picPay: @livedepython
Desconto 30% novatec: MENDESPY
Roteiro
● Sobrecarga de operadores
● Operadores Unários
○ -, +, ~, ...
● Operadores infixos
○ +, -, /, *, ..
● Operadores inplace
○ +=, -=, *=, ...
● Operadores que não podem ser sobrescritos

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.

Esse uso múltiplo de um operador é chamado de sobrecarga do operador”


Concepts of programming languages / Robert W. Sebesta.—10th ed.
Sobrecarga de operadores
“A sobrecarga de operadores permite interoperação entre objetos definidos pelo
usuário e os operadores”. (Fluent Python / Luciano Ramalho)

E digo mais, operações entre tipos nativos com os “nossos tipos”


Operadores unários
Existem 3 tipos de operadores unários em python, que necessariamente foram
projetados para trabalhar com números:

● +: Operador para números positivos ex: +20, +50


● - : Operador para números negativos ex: -20, -30
● ~: Operador de bitwise para (-x -1) ex: ~19 == -20
Operadores unários
Existem 3 tipos de operadores unários em python, que necessariamente foram
projetados para trabalhar com números:

● +: Operador para números positivos ex: +20, +50


● - : Operador para números negativos ex: -20, -30
● ~: Operador de bitwise para (-x -1) ex: ~19 == -20

Em caso de expressões, estes operadores serão invocados antes da


expressão
Operadores unários
Como é possível notar, os operadores
unários, são invocados antes
Operadores unários
Como é possível notar, os operadores
unários, são invocados antes
Operadores unários
Como é possível notar, os operadores
unários, são invocados antes
Operadores infixos
Operadores infixos são aqueles que ficam “entre” objetos.

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

Operador Método Operador Método

+ __add__ == __eq__

- __sub__ << __lshift__

* __mul__ >> __rshift__

/ __floordiv__ % __mod__

// __truediv__ & __and__

< __lt__ | __or__

<= __le__ ... __...__


Operadores infixos
Tá, chega de enrolação, vamos fazer ...
Operadores infixos
Tá, chega de enrolação, vamos fazer ...
Operadores infixos
Tá, chega de enrolação, vamos fazer ...
Agora você está grandinho pra saber
Uma boa prática para objetos que sobrecarregam operadores
é retornar um novo objeto.

Pense que operadores em expressões devem sem ser resolvidos.

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ã?

Dois() + 2 é diferente de 2 + Dois()


Operadores infixos
Tá, ok. Era só isso? NÃO. Em python tem uma peculiaridade interessante. A
comutatividade não é verdadeira por definição. Hã?

Dois() + 2 é diferente de 2 + Dois()


Operadores infixos
Ok, vamos tentar entender a ordem em que o python resolve as expressões

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

Python Fluente - Luciano Ramalho


Operadores infixos

Python Fluente - Luciano Ramalho


Operadores infixos
E pra cada um desses operadores temos um dunder específico e um reverso

Operador Método Reverso

+ __add__ __radd__

- __sub__ __rsub__

* __mul__ __rmul__

/ __floordiv__ __rfloordiv__

// __truediv__ __rtruediv__

<< __lshift__ __rlshift__

>> __rshift__ __rrshift__


Operadores infixos

Python Fluente - Luciano Ramalho


Operador infixo com operação reversa
Operadores infixos (sem reverso)
Métodos de comparação não tem inverso, pois eles já têm a inversão

Operador Método Reverso

== __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

Operador Método Reverso

== __eq__ __ne__

!= __ne__ __eq__

<= __le__ __ge__

>= __ge__ __le__

< __lt__ __gt__

> __gt__ __lt__


Vamos fazer uma lista
bem louca?
Operadores inplace
Você deve ter notado que durante essa longa jornada alguns operadores foram
esquecido, não, eles não foram...

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!

Operador Método Reverso inplace

+ __add__ __radd__ __iadd__

- __sub__ __rsub__ __isub__

* __mul__ __rmul__ __imul__

/ __floordiv__ __rfloordiv__ __ifloordiv__

// __truediv__ __rtruediv__ __itruediv__

<< __lshift__ __rlshift__ __ilshift__

>> __rshift__ __rrshift__ __irshift__

Você também pode gostar