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 Request
classe 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 Request
classe assim:
Request.send() # Sent
Linguagem de código: Python ( python )
O send()
é um objeto de função, que é uma instância da function
classe 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 Request
classe:
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.send
não é uma função como Request.send
. O seguinte verifica se Request.send
é o mesmo objeto que http_request.send
. Ele retornará False
conforme 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
é function
enquanto 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_request
objeto, obterá o TypeError
seguinte:
http_request.send()
Linguagem de código: Python ( python )
Erro:
TypeError: send() takes 0 positional arguments but 1 was given
Linguagem de código: Python ( python )
Como the http_request.send
é um método vinculado ao http_request
objeto, o Python sempre passa implicitamente o objeto para o método como o primeiro argumento.
O seguinte redefine a Request
classe onde a send
função aceita uma lista de argumentos:
class Request:
def send(*args):
print('Sent', args)
Linguagem de código: Python ( python )
O seguinte chama a send
função da Request
classe:
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 Request
classe, o args
nã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_request
objeto é 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 this
objeto.
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
method
classe. - 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
.