2010-11-06 9 views
8

En Ruby se puede hacer esto:¿Cómo hacer un método de clase en python?

class A 
    def self.a 
     'A.a' 
    end 
end 

puts A.a #-> A.a 

¿Cómo se puede hacer esto en Python. Necesito un método de una clase para llamar sin que se llame a una instancia de la clase. Cuando trato de hacer esto me sale este error:

unbound method METHOD must be called with CLASS instance as first argument (got nothing instead) 

Esto es lo que he intentado:

class A 
    def a(): 
     return 'A.a' 

print A.a() 

Respuesta

17

Lo que está buscando es el decorador staticmethod, que se puede utilizar para hacer métodos que no requieren un primer argumento implícito. Se puede utilizar la siguiente manera:

class A(object): 
    @staticmethod 
    def a(): 
     return 'A.a' 

Por otro lado, si desea acceder a la clase (no es el caso) del método, puede utilizar el decorador classmethod, que se utiliza sobre todo de la misma manera:

class A(object): 
    @classmethod 
    def a(cls): 
     return '%s.a' % cls.__name__ 

que todavía se puede llamar sin instanciando el objeto (A.a()).

9

Hay dos maneras de hacer esto:

@staticmethod 
def foo():  # No implicit parameter 
    print 'foo' 


@classmethod 
def foo(cls): # Class as implicit paramter 
    print cls 

La diferencia es que un método estático no tiene parámetros implícitos. Un método de clase recibe la clase a la que se llama exactamente de la misma manera que un método normal recibe la instancia.

El que use depende de si desea que el método tenga acceso a la clase o no.

Se puede llamar a cualquiera de los dos sin una instancia.

0

También puede acceder a la clase de objeto en un método estático utilizando __class__:

class A() : 
    @staticmethod 
    def a() : 
     return '{}.a'.format(__class__.__name__) 

Al menos esto funciona en Python 3.1

+0

no funciona en 2.x –

Cuestiones relacionadas