Métodos Python

Resumo : neste tutorial, você aprenderá sobre os métodos Python e as diferenças entre funções e métodos.

Introdução aos métodos Python

Por definição, um método é uma função vinculada a uma instância de uma classe . Este tutorial ajuda você a entender como funciona nos bastidores.

O seguinte define uma Requestclasse que contém uma função send():

class Request:
    def send():
        print('Sent')Linguagem de código:  Python  ( python )

E você pode chamar a send()função através da Requestclasse assim:

Request.send() # SentLinguagem de código:  Python  ( python )

O send()é um objeto de função, que é uma instância da functionclasse conforme mostrado na saída a seguir:

print(Request.send)Linguagem de código:  Python  ( python )

Saída:

<function Request.send at 0x00000276F9E00310>Linguagem de código:  Python  ( python )

O tipo sendé function:

print(type(Request.send))Linguagem de código:  Python  ( python )

Saída:

<class 'function'>Linguagem de código:  Python  ( python )

O seguinte cria uma nova instância da Requestclasse:

http_request = Request()Linguagem de código:  Python  ( python )

Se você exibir o http_request.send, ele retornará um objeto de método vinculado:

print(http_request.send)Linguagem de código:  Python  ( python )

Saída:

<bound method Request.send of <__main__.Request object at 0x00000104B6C3D580>>Linguagem de código:  Python  ( python )

Portanto, http_request.sendnão é uma função como Request.send. O seguinte verifica se Request.sendé o mesmo objeto que http_request.send. Ele retornará Falseconforme o esperado:

print(type(Request.send) is type(http_request.send))Linguagem de código:  Python  ( python )

O motivo é que o tipo do Request.sendé functionenquanto o tipo do http_request.sendé method, conforme mostrado abaixo:

print(type(http_request.send))  # <class 'method'>
print(type(Request.send))  # <class 'function'>Linguagem de código:  Python  ( python )

Então quando você define uma função dentro de uma classe, ela é puramente uma função. Entretanto, quando você acessa essa função através de um objeto, a função se torna um método.

Portanto, um método é uma função vinculada a uma instância de uma classe.

Se você chamar a send()função por meio do http_requestobjeto, obterá o TypeErrorseguinte:

http_request.send()Linguagem de código:  Python  ( python )

Erro:

TypeError: send() takes 0 positional arguments but 1 was givenLinguagem de código:  Python  ( python )

Como the http_request.sendé um método vinculado ao http_requestobjeto, o Python sempre passa implicitamente o objeto para o método como o primeiro argumento.

O seguinte redefine a Requestclasse onde a sendfunção aceita uma lista de argumentos:

class Request:
    def send(*args):
        print('Sent', args)Linguagem de código:  Python  ( python )

O seguinte chama a sendfunção da Requestclasse:

Request.send()Linguagem de código:  Python  ( python )

Saída:

Sent ()Linguagem de código:  Python  ( python )

A send()função não recebe nenhum argumento.

No entanto, se você chamar a send()função de uma instância da Requestclasse, o argsnão estará vazio:

http_request.send()Linguagem de código:  Python  ( python )

Saída:

Sent (<__main__.Request object at 0x000001374AF4D580>,)Linguagem de código:  Python  ( python )

Neste caso, o send()método recebe um objeto que é o http_request, que é o objeto ao qual está vinculado.

O seguinte ilustra que o objeto que chama o send()método é aquele que o Python passa implicitamente para o método como o primeiro argumento:

print(hex(id(http_request)))
http_request.send()Linguagem de código:  Python  ( python )

Saída:

0x1ee3a74d580
Sent (<__main__.Request object at 0x000001EE3A74D580>,)Linguagem de código:  Python  ( python )

O http_requestobjeto é o mesmo que o Python passa para o send()método como primeiro argumento porque eles têm o mesmo endereço de memória. Em outras palavras, você pode acessar a instância da classe como o primeiro argumento dentro do send()método:

A seguinte chamada de método:

http_request.send()Linguagem de código:  Python  ( python )

é equivalente à seguinte chamada de função:

Request.send(http_request)Linguagem de código:  Python  ( python )

Por esta razão, um método de um objeto sempre tem o objeto como primeiro argumento. Por convenção, é chamado self:

class Request:
    def send(self):
        print('Sent', self)Linguagem de código:  Python  ( python )

Se você trabalhou com outras linguagens de programação, como Java ou C#, selfé igual ao thisobjeto.

Resumo

  • Quando você define uma função dentro de uma classe, ela é puramente uma função. Entretanto, quando você chama a função por meio de uma instância de uma classe, a função se torna um método. Portanto, um método é uma função vinculada a uma instância de uma classe.
  • Um método é uma instância da methodclasse.
  • Um método tem o primeiro argumento ( self) como o objeto ao qual está vinculado.
  • Python passa automaticamente o objeto vinculado ao método como o primeiro argumento. Por convenção, seu nome é self.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *