当我尝试从类的正文中使用静态方法,并使用内置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):<br>
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()
在上次使用后手动将其转换为静态方法来解决此问题,如下所示:
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__
存储原始原始函数的属性(它们必须这样做)。所以这将工作:
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
顺便说一句,尽管我怀疑静态方法对象具有某种存储原始功能的属性,但我对具体细节一无所知。本着教别人钓鱼而不是给他们钓鱼的精神,这就是我所做的调查,并发现了这一点(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
非常有帮助)通常可以非常快速地解决这些问题。
我创建了一个带有endpoint`direct:getRestFromExternalService的Camel路由,当我尝试在另一个类的主方法中使用此endpoint时,我得到了一个异常 在交易所执行时出现异常:交易所[ID-wmli 118067-61025-1493883025815-0-2] 和 终结点上没有可用的使用者:终结点[direct://getRestFromExternalSe
因为MyFinalClass中的getObject(字符串名)方法的实现尚未完成,所以我在调用getObject方法时抛出新的MyException()。但是,该异常不会作为mockito.when(...)调用未被调用,导致断言失败。 请帮帮忙。谢谢你。
我有一个片段类,我想在我的活动的“main”类中调用一个方法。fragment类是静态的,所以这可能是导致问题的原因,尽管我必须使它保持静态。我希望能够在静态类中执行类似的操作:
我已经做了相当多的研究,从我所看到的来看,我一切都是正确的。我试图在JSP文件中调用一个Java类。每次运行时,我都会出现以下错误:
我想在另一个类中通过它的子类调用一个超级类的方法。 例如:类a及其子类CA,CA重写a的方法f() 类B中的CA实例: .... 感谢任何帮助:)
我需要从AsyncTask调用一个非静态方法 必须在onPostExecute中调用此方法 我用过: 编辑:我尝试过: 投掷: