Python静态方法 - 如何从另一个方法调用方法

问题描述 投票:72回答:6

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

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

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

self.dosomethingelse()

因为没有实例。我如何在Python中从同一个类的另一个静态方法调用静态方法?

编辑:多么糟糕。好的,我把问题编辑回原来的问题。我已经得到了Peter Hansen评论中第二个问题的答案。如果你认为我应该为我已经拥有的答案打开另一个问题,请告诉我。

python static-methods
6个回答
69
投票

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()

101
投票

我如何在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()

8
投票

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

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

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

如果它是静态方法:

test.dosomethingelse()

如果是类方法:

cls.dosomethingelse()

5
投票

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

  • class方法有自己的标识,这就是为什么必须在INSTANCE中调用它们。
  • 另一方面,静态方法可以在多个实例之间共享,因此必须从THE CLASS中调用它

1
投票

你不能从静态方法调用非静态方法,但通过在静态方法中创建一个实例....它应该像那样工作

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 instace
        a=test2()
        a.dosomethingelse()

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

test2.dosomething()

希望能帮到你:)


0
投票

如果这些不依赖于类或实例那么为什么不让它们成为函数呢?因为这似乎是明显的解决方案。除非你认为它需要被覆盖,子类等等。如果是这样,那么以前的答案是最好的选择。手指越过我不会被标记为仅仅提供可能适合或不适合某人需要的替代解决方案;)。

正确的答案将取决于相关代码的用例;)享受

© www.soinside.com 2019 - 2024. All rights reserved.