Статические методы Python - как вызвать метод из другого метода


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

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

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

self.dosomethingelse()

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

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

6 66

6 ответов:

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

Как мне сделать в 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()

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

что следует в основном, чтобы ответить "как вы вызываете статический метод из другого статического метода":

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

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

test.dosomethingelse()

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

cls.dosomethingelse()

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

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

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

надеюсь, что поможет :)

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

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