2011-05-14 11 views
9

Quiero tener una función antigua simple como constante de clase. Sin embargo, Python "amablemente" lo convierte en un método para mí:No se puede tener una función como atributo de clase en Python

class C(object): 
    a = 17 
    b = (lambda x : x+1) 

print C.a  # Works fine for int attributes 
print C.b  # Uh-oh... is a <unbound method C.<lambda>> now 
print C.b(1) # TypeError: unbound method <lambda>() must be called 
       # with C instance as first argument (got int instance instead) 
  • ¿Hay una manera de evitar que mi función se convierta en un método?
  • En cualquier caso, ¿cuál es el mejor enfoque "Pythonic" para este problema?

Respuesta

18

métodoestático:

class C(object): 
    a = 17 

    @staticmethod 
    def b(x): 
     return x+1 

O:

class C(object): 
    a = 17 
    b = staticmethod(lambda x : x+1) 
3

Uso staticmethod:

class C(object): 
    a = 17 
    @staticmethod 
    def b(x): 
     return x + 1 
+0

Pero debe considerar [estas advertencias] (http://stackoverflow.com/questions/5212071/python-class-de sign-staticmethod-vs-method/5212190 # 5212190). – senderle

3

definir su función en un módulo, pero no de clase. Es mejor en tu caso.

El primer parámetro del método python normal es self, self debe ser un objeto de instancia.

se debe utilizar métodoestático:

class C(object): 
    a = 17 
    b = staticmethod(lambda x: x+1) 
print C.b(1) 
# output: 2 

o añadir self parámetro, y hacer una instancia de C:

class C(object): 
    a = 17 
    b = lambda self, x: x+1 
c = C() 
c.b(1) 
# output: 2 

otra opción es usar classmethod (simplemente demostrar que puede hacer esto):

class C(object): 
    a = 17 
    b = classmethod(lambda cls, x: x+1) 
C.b(1) 
# output: 2 
+1

Interesante: las lambdas también deben envolverse en método estático/clase. No estaba enterado de esto antes. –

Cuestiones relacionadas