2013/5/8 Lucas Sampaio <
m...@lsmagalhaes.com>:
> Me corrijam se eu estiver errado, mas deixe eu acrescentar algo:
>
> Um staticmethod, como o Vinicius falou, é similar ao que vemos em outras
> linguagens. No geral é apenas uma função "presa" no escopo da classe.
>
> Um classmethod, da forma como eu entendi, é uma função cujo primeiro
> argumento é a classe, assim como nos métodos de um objeto o primeiro
> argumento é o objeto em si. Assim:
>
> # numa classe Bar
> @classmethod
> def foo(cls, a):
> pass
>
> Bar.foo(2) # válido
> bar = Bar()
> bar.foo(2) # ainda válido
>
> Além disso, classmethods são "sensíveis" à hierarquia de classes. Assim, se
> você criar class Baz(Bar), a classe passada para o método será "Baz".
>
> ---
> Lucas S. Magalhães
> Developer at Órama
>
http://lsmagalhaes.com
Explorando um pouco mais o staticmethod, é legal notar o que acontece
se você tenta "pendurar" uma função qualquer em uma classe:
def f(x):
return x
class A(object):
pass
>>> A.f = f
>>> A.f(1)
TypeError: unbound method f() must be called with A instance as first
argument (got int instance instead)
>>> A().f(1)
TypeError: f() takes exactly 1 argument (2 given)
O descriptor da classe transforma em uma chamada de método.
>>> A.f = staticmethod(f)
>>> A.f(1)
1
Agora sim, a função é chamada sem o parâmetro adicional que o
descriptor da classe insere.
--
Paul Eipper