当我尝试从类的主体中使用静态方法,并使用内置staticmethod函数作为装饰器定义静态方法时,如下所示:
staticmethod
class Klass(object): @staticmethod # use as decorator def _stat_func(): return 42 _ANS = _stat_func() # call the staticmethod def method(self): ret = Klass._stat_func() + Klass._ANS return ret
我收到以下错误:
Traceback (most recent call last): File "call_staticmethod.py", line 1, in <module> class Klass(object): File "call_staticmethod.py", line 7, in Klass _ANS = _stat_func() TypeError: 'staticmethod' object is not callable
我理解为什么会发生这种情况(描述符绑定) ,并且可以通过_stat_func()在上次使用后手动转换为静态方法来解决它,如下所示:
_stat_func()
class Klass(object): def _stat_func(): return 42 _ANS = _stat_func() # use the non-staticmethod version _stat_func = staticmethod(_stat_func) # convert function to a static method def method(self): ret = Klass._stat_func() + Klass._ANS return ret
所以我的问题是:
有没有更干净或更“ Pythonic ”的方法来完成这个?
staticmethod对象显然具有__func__存储原始原始函数的属性(它们必须这样做是有道理的)。所以这将起作用:
__func__
class Klass(object): @staticmethod # use as decorator def stat_func(): return 42 _ANS = stat_func.__func__() # call the staticmethod def method(self): ret = Klass.stat_func() return ret
顺便说一句,虽然我怀疑 staticmethod 对象具有某种存储原始函数的属性,但我不知道具体情况。本着教别人钓鱼而不是给他们一条鱼的精神,这就是我所做的调查并找出答案(我的 Python 会话中的 C&P):
>>> class Foo(object): ... @staticmethod ... def foo(): ... return 3 ... global z ... z = foo >>> z <staticmethod object at 0x0000000002E40558> >>> Foo.foo <function foo at 0x0000000002E3CBA8> >>> dir(z) ['__class__', '__delattr__', '__doc__', '__format__', '__func__', '__get__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__'] >>> z.__func__ <function foo at 0x0000000002E3CBA8>
在交互式会话中进行类似的挖掘(dir非常有帮助)通常可以非常快速地解决这些问题。
dir