当前位置: 首页 > 面试题库 >

在类主体中调用类staticmethod?

常哲彦
2023-03-14
问题内容

当我尝试从类的正文中使用静态方法,并使用内置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中调用此方法 我用过: 编辑:我尝试过: 投掷: