Статические методы Python - как вызвать метод из другого метода - PullRequest
74 голосов
/ 07 декабря 2009

Когда у меня есть обычные методы для вызова другого метода в классе, я должен сделать это

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

но когда у меня есть статические методы, я не могу написать

self.dosomethingelse()

потому что нет экземпляра. Как мне сделать в Python для вызова статического метода из другого статического метода того же класса?

Редактировать: какой беспорядок. Хорошо, я отредактировал вопрос до исходного вопроса. У меня уже есть ответ на второй вопрос, который есть в комментарии Питера Хансена. Если вы думаете, что я должен открыть другой вопрос для ответа, который у меня уже есть, скажите мне, пожалуйста.

Ответы [ 6 ]

95 голосов
/ 05 ноября 2010

Как мне сделать в 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()
66 голосов
/ 07 декабря 2009

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()
8 голосов
/ 07 декабря 2009

ПРИМЕЧАНИЕ - похоже, вопрос несколько изменился. Ответ на вопрос о том, как вызывать метод экземпляра из статического метода, заключается в том, что вы не можете без передачи экземпляра в качестве аргумента или создания экземпляра этого экземпляра внутри статического метода.

Далее следует ответить «как вызвать статический метод из другого статического метода»:

Имейте в виду, что - это разница между статическими методами и методами класса в Python. Статический метод не принимает неявный первый аргумент, в то время как метод класса принимает класс в качестве неявного первого аргумента (обычно cls по соглашению). Имея это в виду, вот как вы это сделаете:

Если это статический метод:

test.dosomethingelse()

Если это метод класса:

cls.dosomethingelse()
5 голосов
/ 07 декабря 2009

ОК, основное различие между методами класса и статическими методами:

  • метод класса имеет свою собственную идентичность, поэтому он должен вызываться из INSTANCE.
  • с другой стороны, статический метод может использоваться несколькими экземплярами, поэтому его необходимо вызывать из THE CLASS
1 голос
/ 07 декабря 2009

Вы не можете вызывать нестатические методы из статических методов, но создавая экземпляр внутри статического метода .... это должно работать так

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 голосов
/ 30 мая 2017

Если они не зависят от класса или экземпляра, то почему бы просто не сделать их функцией? Как это может показаться очевидным решением. Если, конечно, вы не думаете, что это нужно будет перезаписать, подкласс и т. Д. Если так, то предыдущие ответы являются лучшим выбором. Скрестив пальцы, я не буду отмечен за то, что просто предложил альтернативное решение, которое может или не может удовлетворить чьи-то потребности;).

Поскольку правильный ответ будет зависеть от варианта использования рассматриваемого кода;) Наслаждайтесь

...