No se puede tener una función como atributo de clase en Python

Quiero tener una función antigua simple como una constante de clase. Sin embargo, Python “útilmente” lo convierte en un método para mí:

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

método está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) 

Utilice el staticmethod :

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

Define tu función en un módulo pero no en clase. Es mejor en tu caso.

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

Debes usar el método estático:

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

o agrega self parámetro self , y crea una instancia de C:

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

otra opción es usar classmethod (solo demuestra que puedes hacer esto):

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