@classmethod e @staticmethod

290 views
Skip to first unread message

Leonam Silva

unread,
May 8, 2013, 10:07:36 AM5/8/13
to python...@googlegroups.com
Alguem pode me dizer quais a diferença entre os dois, e principalmente qual o beneficio de usar um ou outro, Obrigado

--
Leonam Gama da Silva
Graduando Ciência da Cimputação
Programador Jr
                                                              @Leonam_cbcc 
       
   

Vinicius Assef

unread,
May 8, 2013, 10:24:16 AM5/8/13
to python...@googlegroups.com
Na documentação[1] diz assim:
Static methods in Python are similar to those found in Java or C++. Also see classmethod() for a variant that is useful for creating alternate class constructors.

Então, staticmethod() é o que já conhecemos: um método que atua sobre a classe, não sobre as instâncias ela.

O classmethod() é uma forma de criar construtores alternativos para uma classe. Como exemplo, do próprio Python, veja o método dict.fromkeys() [2]. Ele é um classmethod() que te permite criar um dicionário de um modo diferente do construtor normal.
Vinicius Assef



2013/5/8 Leonam Silva <leohen...@gmail.com>
--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com
 
---
Você está recebendo esta mensagem porque se inscreveu no grupo "python-brasil" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para python-brasi...@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
 
 

Lucas Sampaio

unread,
May 8, 2013, 11:01:59 AM5/8/13
to python...@googlegroups.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

Paul Eipper

unread,
May 8, 2013, 12:12:17 PM5/8/13
to python-brasil
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

Leonam Silva

unread,
May 9, 2013, 8:39:10 AM5/9/13
to python...@googlegroups.com
o primeiro parametro  em  um @classmethod é usado como oq? uma instancia?


--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar

<*> Para visitar o site do grupo na web, acesse:
    http://groups.google.com/group/python-brasil

<*> Para sair deste grupo, envie um e-mail para:
    python-brasi...@googlegroups.com

---
Você está recebendo esta mensagem porque se inscreveu no grupo "python-brasil" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para python-brasi...@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.


Lucas Sampaio

unread,
May 9, 2013, 9:52:13 AM5/9/13
to python...@googlegroups.com
O primeiro parâmetro é o da classe que está "disparando" o método (imagino que seja essa a explicação). Por exemplo:

class Foo(object):
    @classmethod
    def bar(cls):
        print 'Dentro de um método de classe'

Foo.bar()  # Aqui, cls é "Foo", a classe que chamou o classmethod
foo = Foo()
foo.bar()  # instâncias também podem chamar métodos de classe. Aqui, cls ainda é "Foo"

---
Lucas S. Magalhães
Developer at Órama
http://lsmagalhaes.com


Reply all
Reply to author
Forward
0 new messages