在Python中不能将函数作为类属性

时间:2011-05-14 03:12:57

标签: python class

我希望将一个普通的旧函数作为类常量。但是,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)
  • 有没有办法阻止我的功能成为一种方法?
  • 无论如何,解决这个问题的最佳“Pythonic”方法是什么?

3 个答案:

答案 0 :(得分:21)

静态方法:

class C(object):
    a = 17

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

或者:

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

答案 1 :(得分:3)

使用staticmethod

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

答案 2 :(得分:3)

在模块中定义函数,但不在类中定义。在你的情况下,它会更好。

普通python方法的第一个参数是selfself必须是实例对象。

你应该使用staticmethod:

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

或添加self参数,并创建C:

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

另一种选择是使用classmethod(只显示你可以这样做):

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