O que é um" método " em Python?

Alguém pode, por favor, explicar-me em termos muito simples o que é um "método" em Python?

A coisa está em muitos tutoriais em Python para iniciantes esta palavra é usada de tal forma como se o iniciante já soubesse o que é um método no contexto do Python. Embora eu esteja, naturalmente, familiarizado com o significado geral desta palavra, não faço ideia do que este termo significa em Python. Então, por favor, explique-me o que é o método "Pythonian".

algum código de exemplo muito simples faria ser muito apreciado como uma imagem vale mil palavras.

Author: Bill the Lizard, 2010-09-24

5 answers

É uma função que é membro de uma classe:

class C:
    def my_method(self):
        print "I am a C"

c = C()
c.my_method()  # Prints "I am a C"
Tão simples quanto isso!

(Existem também alguns tipos alternativos de método, permitindo-lhe controlar a relação entre a classe e a função. Mas acho que, pela sua pergunta, não está a perguntar sobre isso, mas apenas o básico.)

 70
Author: RichieHindle, 2010-09-24 12:14:26

Um método é uma função que toma uma instância de classe como seu primeiro parâmetro. Os métodos são membros de classes.

class C:
    def method(self, possibly, other, arguments):
        pass # do something here
Como você queria saber o que significa especificamente em Python, pode-se distinguir entre métodos ligados e não vinculados. Em Python, todas as funções (e como tais também métodos) são objetos que podem ser passados e "tocados com". Assim, a diferença entre os métodos não vinculados e os métodos vinculados é:

1) Métodos ligados

# Create an instance of C and call method()
instance = C()

print instance.method # prints '<bound method C.method of <__main__.C instance at 0x00FC50F8>>'
instance.method(1, 2, 3) # normal method call

f = instance.method
f(1, 2, 3) # method call without using the variable 'instance' explicitly

Os Métodos de encadernação são métodos que pertencem a instâncias de uma classe. Neste exemplo, instance.method Está ligado à instância chamada instance. Toda vez que o método de encadernação é chamado, a instância é passada como primeiro parâmetro automagicamente - que é chamado self por convenção.

2) métodos não vinculados

print C.method # prints '<unbound method C.method>'
instance = C()
C.method(instance, 1, 2, 3) # this call is the same as...
f = C.method
f(instance, 1, 2, 3) # ..this one...

instance.method(1, 2, 3) # and the same as calling the bound method as you would usually do

Quando você acessar C.method (o método dentro de uma classe em vez de dentro de uma instância), você obtém um método não consolidado. Se você quiser chamá - lo, você tem que passar a instância como primeiro parâmetro porque o método é não vinculado a nenhuma instância.

Sabendo essa diferença, você pode fazer uso de funções / métodos como objetos, como passar métodos ao redor. Como exemplo de caso de uso, imagine uma API que lhe permite definir uma função de callback, mas você quer fornecer um método como função de callback. Não há problema, basta passar self.myCallbackMethod como o callback e ele será automaticamente chamado com a instância como primeiro argumento. Isso não seria possível em linguagens estáticas como C++ (ou apenas com truque).

Espero que tenhas percebido ;) acho que é tudo o que deves saber sobre o básico do método. Você também poderia ler mais sobre os decoradores classmethod e staticmethod, mas esse é outro tópico.

 35
Author: AndiDog, 2010-09-24 13:40:56

Em Python, o método é uma função que está disponível para um dado objecto por causa do tipo do objecto .

Por exemplo, se criar my_list = [1, 2, 3], o método append pode ser aplicado a my_list porque é uma lista em Python: my_list.append(4). Todas as listas têm um método append simplesmente porque são listas.

Como outro exemplo, se criar my_string = 'some lowercase text', o método upper pode ser aplicado a my_string simplesmente porque é uma cadeia de Python: my_string.upper().

Listas não têm um upper método, e cadeias de caracteres não têm um método append. Por quê? Porque os métodos só existem para um objecto em particular se tiverem sido explicitamente definidos para esse tipo de objecto , e os programadores do Python decidiram (até agora) que esses métodos em particular não são necessários para esses objectos em particular.

Para chamar um método, o formato é object_name.method_name(), e quaisquer argumentos para o método são listados dentro dos parênteses. O método atua implicitamente sobre o objeto que está sendo nomeado, e, portanto, alguns os métodos não têm argumentos já que o objeto em si é o único argumento necessário. Por exemplo, my_string.upper() não tem nenhum argumento listado porque o único argumento requerido é o próprio objeto, my_string.

Um ponto comum de confusão diz respeito ao seguinte:

import math
math.sqrt(81)

É {[15] } um método do objecto math? Não. é assim que se chama a função sqrt do módulo math. O formato a ser usado é module_name.function_name(), em vez de object_name.method_name(). Em geral, a única maneira de distinguir entre os dois formatos (visualmente) é examinar o resto do código e veja se a parte antes do período (math, my_list, my_string) é definido como um objeto ou um módulo.

 18
Author: Kevin Markham, 2016-03-05 10:14:54
Desculpa, mas, na minha opinião, o RichieHindle tem toda a razão em dizer esse método...
É uma função que é membro de uma classe.
Aqui está o exemplo de uma função que se torna membro da classe. Desde então se comporta como um método da classe. Vamos começar com a classe vazia e a função normal com um argumento:
>>> class C:
...     pass
...
>>> def func(self):
...     print 'func called'
...
>>> func('whatever')
func called

Agora adicionamos um membro à classe C, que é a referência à função. Depois disso podemos criar a instância da classe e chamar seu método como se ele fosse definido dentro da classe:

>>> C.func = func
>>> o = C()
>>> o.func()
func called

Também podemos usar a forma alternativa de chamar o método:

>>> C.func(o)
func called

O o.func manifesta-se da mesma forma que o método de classe:

>>> o.func
<bound method C.func of <__main__.C instance at 0x000000000229ACC8>>
E podemos tentar a abordagem inversa. Vamos definir uma classe e roubar o seu método como uma função:
>>> class A:
...     def func(self):
...         print 'aaa'
...
>>> a = A()
>>> a.func
<bound method A.func of <__main__.A instance at 0x000000000229AD08>>
>>> a.func()
aaa
Até agora, parece igual. Agora o roubo da função:
>>> afunc = A.func
>>> afunc(a)
aaa    
A verdade é que ... o método não aceita qualquer argumento:
>>> afunc('whatever')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unbound method func() must be called with A instance as first 
  argument (got str instance instead)
IMHO, este não é o argumento contra o método é uma função que é membro de uma classe .

Mais tarde encontrei a resposta de Alex Martelli que basicamente diz o mesmo. Desculpe se considera duplicação:)

 2
Author: pepr, 2017-05-23 11:33:27

Http://docs.python.org/2/tutorial/classes.html#method-objects

Normalmente, um método é chamado logo após estar ligado:

x.f()

No exemplo de MyClass, isto irá devolver o texto 'Olá mundo'. No entanto, não é necessário chamar um método imediatamente: x. f é um method object, and can be stored away and called at a later time. Para exemplo:

xf = x.f
while True:
    print xf()

Continuará a imprimir o hello world até ao fim dos tempos.

O que foi? exatamente acontece quando um método é chamado? Deves ter reparado. que x. f () foi chamado sem um argumento acima, mesmo que o a definição da função para f () especificou um argumento. O que aconteceu com a discussão? Certamente Python levanta uma exceção quando uma função que requer um argumento é chamado sem qualquer-mesmo que o argumento não é usado... Na verdade, você deve ter adivinhado a resposta: a coisa especial sobre métodos é que o objeto é passado como o primeiro argumentação das partes funcao. No nosso exemplo, a chamada x.f() é exatamente equivalente a A minha classe.f (x). Em geral, chamar um método com uma lista de argumentos n é equivalente a invocar a função correspondente com um argumento lista que é criada inserindo o objecto do método antes da primeira argumento. Se você ainda não entende como os métodos funcionam, dê uma olhada no a implementação pode talvez clarificar as coisas. Quando um atributo de instância é referenciado que não é um dado atributo, a sua classe é procurada. Se o nome denota um atributo de classe válido que é um objeto de função, um o objecto do método é criado pela embalagem (apontadores para) do objecto da instância e o objecto da função encontrado junto num objecto abstracto: este é o objeto do método. Quando o objecto do método é chamado com um lista de argumentos, uma nova lista de argumentos é construída a partir da instância objeto e a lista de argumentos, e o objeto da função é chamado com este novo argumento lista.
 0
Author: acmerfight, 2013-10-31 06:10:49