Skip to content

Latest commit

 

History

History
212 lines (191 loc) · 8.15 KB

magic_methods.md

File metadata and controls

212 lines (191 loc) · 8.15 KB

Magic Methods


  • O metodos magicos são uma forma de adicionar uma "magia" para seu codigo. Esses metodos não são invocados diretamente por você, mas são usados internomente pelo python;

  • Por exemplo, em uma soma de dois numeros usamos o operador +, porém, internomente o método __ add __() é chamado. Veja o exemplo pratico, realizando uma soma da forma convencional:

        >>> num = 10
        >>> num + 5
        15
  • O mesmo resultado é retornado se usarmos o método __ add __():

        >>> num.__add__(5)
        15
  • As classes padrões no python usam esses métodos magicos. Para visualizar esses métodos, use a função dir(), veja abaixo a lista de atributos e métodos magicos usados pela classe int:

        >>> dir(int)
    
        ['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__',
         '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', 
         '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', 
         '__getattribute__', '__getnewargs__', '__gt__', '__hash__', 
         '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', 
         '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', 
         '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', 
         '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', 
         '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', 
         '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', 
         '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', 
         '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 
         'as_integer_ratio', 'bit_length', 'conjugate', 'denominator', 
         'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
Como invocar esses métodos
Método magico Quando é invocado (exemplo) Explicação
__new__(cls [,...]) instancia = MinhaClasse(arg1, arg2) __new__ é chamado quando criamos um instancia.
__init__(self [,...]) instancia = MinhaClasse(arg1, arg2) __init__ é chamado quando a instancia que criamos será inicializada.
__cmp__(self, other) self == other, self > other, etc... Chamado quando vamos realizar qualquer compração.
__pos__(self) +self Sinal de "mais".
__neg__(self) -self Sinal de "menos".
__invert__(self) ~self Inversão de bits.
__index__(self) x[self] Para ser chamado na conversão de tipo para um int quando o objeto é usado em uma slice expression. (explicado no final desse tópico).
__bool__(self) bool(self) Retorna o valor booleano de um objeto.
__getattr__(self, nome) self.nome # nome doesn't exist Você pode usar para dizer a uma classe como lidar com atributos que ela não gerencia explicitamente.
__setattr__(self, nome, val) self.nome = val Definir um valor para um atributo.
__delattr__(self, nome) del self.nome Deletar um atributo.
__getattribute__(self, nome) self.nome Acessar qualquer atributo.
__getitem__(self, key) self[key] Acessar qualquer item, usando um indice.
__setitem__(self, key, val) self[key] = val Atribuir um valor a um item, por meio de um indice.
__delitem__(self, key) del self[key] Deletar um item, por meio de um indice.
__iter__(self) for x in self Interação
__contains__(self, value) value in self, value not in self Usado para verificar se um item contém certo valor.in
__call__(self [,...]) self(args) "Chamar" uma instancia de algo (variavel, função, etc...).
__enter__(self) with self as x: with Gerenciador de contexto.
__exit__(self, exc, val, trace) with self as x: with Gerenciador de contexto.
__getstate__(self) pickle.dump(pkl_file, self) Serialização.
__setstate__(self) data = pickle.load(pkl_file) Serialização.
__slots__(self) __slots__ = 'foo', 'bar' permite que você indique explicitamente quais atributos de instância você espera que suas instâncias de objeto tenham.

Bom saber:

  • slice expression:

    • A função slice() retorna a fatia de um objeto;

    • Você pode usar essa função para separar uma sequencia de valores (uma lista, por exemplo).

    • Syntax:

      • slice(inicio, fim, intervalo)
      Parametro Descrição
      inicio Opcional. Usando um numero inteiro, você poderá definir por onde o "corte" iniciará. O padrão 0 (zero).
      fim Usando um numero inteiro, você poderá definir por onde o "corte" terminará.
      intervalo Opcional. Um numero inteiro definirá o intervalo no qual a função irá percorrer. O padrão é 1 (Um).
  • gerenciadores de contexto:

    • Os gerenciadores de contexto permitem que você aloque e libere recursos precisamente quando desejar. O exemplo mais amplamente usado de gerenciadores de contexto é a instrução with. Por exemplo:

          with open('arquivo.txt', 'w') as arq:
              arq.write('Olá, mundo!')