2009-12-07 4 views
56

Когда у меня есть регулярные методы вызова другого метода в классе, я должен сделать это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 для вызова статического метода из другого статического метода того же класса?

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

+2

@pablo: Вы не можете изменить суть вопроса !! Заканчиваем этот вопрос и начинаем ** еще один ** !! – jldupont

+0

ОК, хорошо. вы хотите удалить вопрос? Ответ уже есть в комментарии Питера Хансена – Pablo

+0

@pablo: вы не можете удалить здесь, что не будет вежливым для всех, кто внес ответы на ваш вопрос. Вы должны принять ответ ** и ** создать новый вопрос. – jldupont

ответ

47

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

Здесь необходимо добавить совет: ясно, что методы класса не имеют недостатков по сравнению с staticmethods, а методы класса позволяют в будущем расширять метод для вызова других методов класса. Таким образом, это всегда должно быть предпочтительным, хотя немедленной необходимости нет. – u0b34a0f6ae

+0

** ПРИМЕЧАНИЕ ** @pablo ** изменен ** вопрос !!!!! – jldupont

+1

@ u0b34a0f6ae: Я не знаю, делаю ли я что-то хорошее или нет ... но я определил декоратор внутри класса. Декоратор должен был быть «статическим методом», а не «classmethod». –

8

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

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

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

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

test.dosomethingelse() 

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

cls.dosomethingelse() 
+1

вы можете использовать 'cls.dosomethingelse()' из определения класса. – jldupont

+1

Чтобы быть более точным, вы можете использовать 'cls.dosomethingelse()' только из самого метода класса. Точно так же, как вы можете использовать 'self' только внутри самого метода экземпляра. –

+1

Извините, я неправильно написал вопрос. ОЙ !. Я хотел написать «Как мне сделать в Python для вызова метода экземпляра из другого статического метода того же класса», а не «Как мне сделать в Python для вызова статического метода из другого статического метода того же самого class " – Pablo

2

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

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

надежда, что поможет вам :)

+1

IMO этот подход заметно хуже, чем просто использование '@ classmethod' для объявления ваших методов и использование' cls.dosomethingelse() 'внутри' cls.dosomething() '- хуже с точки зрения производительности (создание экземпляров объектов только для получения доступ к статическому методу) и читаемость (это не просто, и я предполагаю, что если этот тип шаблонов стал шаблоном, вся кодовая база может стать довольно сложной для простого человека для анализа) –

+0

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

3

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

69

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^