129

当我有在类中调用另一个方法的常规方法时,我必须这样做

class test:
    def __init__(self):
        pass
    def dosomething(self):
        print "do something"
        self.dosomethingelse()
    def dosomethingelse(self):
        print "do something else"

但是当我有静态方法时,我无法编写

self.dosomethingelse()

因为没有实例。我必须在 Python 中做什么才能从同一类的另一个静态方法调用静态方法?

4

6 回答 6

176

如何在 Python 中从同一类的另一个静态方法调用静态方法?

class Test() :
    @staticmethod
    def static_method_to_call()
        pass

    @staticmethod
    def another_static_method() :
        Test.static_method_to_call()

    @classmethod
    def another_class_method(cls) :
        cls.static_method_to_call()
于 2010-11-05T08:08:06.637 回答
96

class.method应该管用。

class SomeClass:
  @classmethod
  def some_class_method(cls):
    pass

  @staticmethod
  def some_static_method():
    pass

SomeClass.some_class_method()
SomeClass.some_static_method()
于 2009-12-07T13:26:39.653 回答
12

注意 - 看起来问题已经改变了一些。关于如何从静态方法调用实例方法的问题的答案是,如果不将实例作为参数传入或在静态方法中实例化该实例,就无法做到这一点。

以下主要是回答“如何从另一个静态方法调用静态方法”:

请记住,Python 中的静态方法和类方法之间存在差异。静态方法不采用隐式第一个参数,而类方法将类作为隐式第一个参数(通常cls按照约定)。考虑到这一点,您可以这样做:

如果是静态方法:

test.dosomethingelse()

如果是类方法:

cls.dosomethingelse()
于 2009-12-07T13:25:49.673 回答
3

好的,类方法和静态方法之间的主要区别是:

  • 类方法有它自己的标识,这就是为什么它们必须从一个实例中调用。
  • 另一方面,静态方法可以在多个实例之间共享,因此必须从类中调用它
于 2009-12-07T15:13:55.180 回答
2

如果这些不依赖于类或实例,那么只需将它们设为函数即可。

因为这似乎是显而易见的解决方案。除非您当然认为它需要被覆盖、子类化等。如果是这样,那么以前的答案是最好的选择。祈祷我不会仅仅因为提供可能满足或不满足某人需求的替代解决方案而被贬低;)。

因为正确答案取决于相关代码的用例;)

于 2017-05-30T10:01:07.020 回答
0

您不能从静态方法调用非静态方法,而是通过在静态方法中创建实例。

它应该这样工作

class test2(object):
    def __init__(self):
        pass

    @staticmethod
    def dosomething():
        print "do something"
        # Creating an instance to be able to
        # call dosomethingelse(), or you
        # may use any existing instance
        a = test2()
        a.dosomethingelse()

    def dosomethingelse(self):
        print "do something else"

test2.dosomething()
于 2009-12-07T14:48:05.327 回答