I want to have a plain old function as a class constant. However, Python "helpfully" turns it into a method for me:
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 m开发者_JS百科ethod <lambda>() must be called
# with C instance as first argument (got int instance instead)
- Is there a way to prevent my function from becoming a method?
- In any case, what is the best "Pythonic" approach to this problem?
staticmethod:
class C(object):
a = 17
@staticmethod
def b(x):
return x+1
Or:
class C(object):
a = 17
b = staticmethod(lambda x : x+1)
Use staticmethod
:
class C(object):
a = 17
@staticmethod
def b(x):
return x + 1
Define your function in a module but not class. It's better in your case.
First paramter of normal python method is self
, self
must be an instance object.
you should use staticmethod:
class C(object):
a = 17
b = staticmethod(lambda x: x+1)
print C.b(1)
# output: 2
or add self
parameter, and make an instance of C:
class C(object):
a = 17
b = lambda self, x: x+1
c = C()
c.b(1)
# output: 2
another choice is using classmethod (just show you can do this):
class C(object):
a = 17
b = classmethod(lambda cls, x: x+1)
C.b(1)
# output: 2
精彩评论