Когда у меня есть обычные методы для вызова другого метода в классе, я должен сделать это
class test:
def __init__(self):
pass
def dosomething(self):
print "do something"
self.dosomethingelse()
def dosomethingelse(self):
print "do something else"
но когда у меня есть статические методы, я не могу писать
self.dosomethingelse()
потому что нет экземпляра. Как мне сделать в Python вызов статического метода из другого статического метода того же класса?
Изменить: какой беспорядок. Хорошо, я вернул вопрос к исходному вопросу. У меня уже есть ответ на второй вопрос в комментарии Питера Хансена. Если вы думаете, что я должен открыть другой вопрос, чтобы получить ответ, который у меня уже есть, пожалуйста, скажите мне.
python
static-methods
Пабло
источник
источник
Ответы:
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()
источник
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()
источник
Test.static_method_to_call()
должен работать и из других нестатических и неклассовых методов этого класса, верно? (... и, возможно, другие классы тоже?)Test.static_method_to_call()
работать будет откуда угодно.ПРИМЕЧАНИЕ - похоже, вопрос немного изменился. Ответ на вопрос о том, как вы вызываете метод экземпляра из статического метода, заключается в том, что вы не можете не передать экземпляр в качестве аргумента или не создать экземпляр этого экземпляра внутри статического метода.
Далее следует в основном ответ «как вызвать статический метод из другого статического метода»:
Имейте в виду , что есть разница между статическими методами и методами класса в Python. Статический метод не принимает неявный первый аргумент, тогда как метод класса принимает класс в качестве неявного первого аргумента (обычно
cls
по соглашению). Имея это в виду, вот как вы это сделаете:Если это статический метод:
Если это метод класса:
источник
cls.dosomethingelse()
внутри определения класса.cls.dosomethingelse()
из самого метода класса. Точно так же, как вы можете использовать толькоself
из самого метода экземпляра.ОК, основное различие между методами класса и статическими методами:
источник
MyClass.class_method()
из любого места, о котором известноMyClass
(может быть, вы думали о «методах экземпляра»?)Если они не зависят от класса или экземпляра, почему бы просто не сделать их функцией? Поскольку это казалось бы очевидным решением. Если, конечно, вы не думаете, что его нужно будет перезаписать, создать подкласс и т. Д. Если это так, то предыдущие ответы - лучший выбор. Скрестив пальцы, я не получу скидку за то, что просто предлагаю альтернативное решение, которое может или не может соответствовать чьим-то потребностям;).
Поскольку правильный ответ будет зависеть от варианта использования рассматриваемого кода;) Наслаждайтесь
источник
вы не можете вызывать нестатические методы из статических методов, но создавая экземпляр внутри статического метода .... он должен работать так
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()
надеюсь, что это поможет вам :)
источник
@classmethod
для объявления ваших методов и использованиеcls.dosomethingelse()
внутриcls.dosomething()
- хуже с точки зрения производительности (создание экземпляров объектов только для получения доступа к статическому методу) и удобочитаемости (это непросто, и я предполагаю, что этот вид шаблона стало шаблонным, вся кодовая база может стать довольно сложной для простого человека для синтаксического анализа)