Статичні методи - Як викликати метод з іншого методу?


96

Коли у мене є звичайні методи виклику іншого методу в класі, я повинен це зробити

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

але коли у мене є статичні методи, я не можу писати

self.dosomethingelse()

тому що інстанції немає. Як мені робити в Python для виклику статичного методу з іншого статичного методу того ж класу?

Редагувати: який безлад. Гаразд, я відредагував запитання до початкового. Я вже маю відповідь на друге питання, яке є в коментарі Пітера Хансена. Якщо ви вважаєте, що мені слід відкрити ще одне питання для відповіді, яку я вже маю, скажіть, будь ласка.


3
@pablo: ти не можеш змінити суті питання !! Завершіть це питання і почніть інше !!
jldupont

добре-добре. Ви маєте на увазі видалити питання? Відповідь вже є в коментарі Пітера Хансена
Пабло

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

1
@pablo: і лише для того, щоб бути зрозумілими: слід прийняти відповідь на оригінальне формулювання запитання. Не хвилюйся, ти навчишся тут.
Вітаємо

Відповіді:


79

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

17
Сюди слід додати пораду: Зрозуміло, що classmethods не мають недоліків щодо staticmethods, а classmethods дозволяє розширити метод у майбутньому, щоб викликати інші методи класу. Таким чином, йому слід віддавати перевагу завжди, навіть якщо немає негайної потреби.
u0b34a0f6ae

1
@ u0b34a0f6ae: Я не знаю, роблю щось хороше чи ні ... але я визначив декоратор всередині класу. Декоратор повинен був бути "статичним методом", а не "методом класу".
Андре Кальдас,

@ u0b34a0f6ae Чи є методи класу завжди потікобезпечними? У моєму випадку використання я використовую staticmethods у потоках, щоб запобігти випадковому доступу до класу, який може бути не безпечним для потоків.
aquavitae

@ u0b34a0f6ae завжди трохи сильний. Наприклад, використання статичних методів PySpark може бути використано в робочих місцях rdd, а методів класів - ні.
Лорен Коппенол,

136

Як мені робити в 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()

Виклик також Test.static_method_to_call()повинен працювати з інших нестатичних та некласових методів цього класу, так? (... і, мабуть, також інші класи?)
gr4nt3d

Так, Test.static_method_to_call()буде працювати з будь-якого місця.
warvariuc

11

ПРИМІТКА - схоже, запитання дещо змінило. Відповідь на питання про те, як ви викликаєте метод екземпляра із статичного методу, полягає в тому, що ви не можете, не передаючи екземпляр як аргумент або не створюючи екземпляр цього екземпляра всередині статичного методу.

Далі слід здебільшого відповісти "як ви викликаєте статичний метод з іншого статичного методу":

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

Якщо це статичний метод:

test.dosomethingelse()

Якщо це метод класу:

cls.dosomethingelse()

1
Ви можете використовувати лише cls.dosomethingelse()з визначення класу.
jldupont

3
Щоб бути точнішим, ви можете використовувати лише cls.dosomethingelse()сам метод класу. Так само, як ви можете використовувати лише selfз самого методу екземпляра.
Джейсон Бейкер,

1
вибачте, я неправильно написав питання. OOPS !. Я хотів написати "Як мені робити в Python для виклику методу екземпляра з іншого статичного методу того ж класу", а не "Як мені робити в Python для виклику статичного методу з іншого статичного методу того самого класу клас "
Пабло

@pablo: У цьому випадку вам потрібно написати ще одне запитання і закінчити це.
jldupont

@jldupont, я вже маю відповідь, але в одному коментарі. Що мені робити, бо я не можу це прийняти, але стерти запитання було б марно, правда?
Пабло

4

ОК, основна відмінність між методами класу та статичними методами полягає в:

  • метод class має свою власну ідентичність, тому їх потрібно викликати зсередини INSTANCE.
  • з іншого боку, статичний метод може бути спільним для кількох екземплярів, так що його потрібно викликати всередині КЛАСУ

0

ви не можете викликати нестатичні методи зі статичних методів, але створюючи екземпляр всередині статичного методу .... він повинен працювати так

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

сподіваюся, що вам допоможе :)


3
ІМО такий підхід набагато гірший, ніж просто використання @classmethodдля декларування своїх методів, а використання cls.dosomethingelse()всередині cls.dosomething()- гірше як з точки зору продуктивності (створення екземплярів об’єктів лише для отримання доступу до статичного методу), так і читабельності (це не просто, і я думаю, якщо такий сорт зразка став зразковим, розбір цілої кодової бази може стати досить складним для простої людини)
Кайл Уайлд

Як я читав десь ще в SO, замість того, щоб ініціалізувати екземпляр безпосередньо для виклику методу, ви можете просто викликати його - він сам ініціалізується.
Накілон

0

Якщо вони не залежать від класу чи екземпляра, то чому б просто не зробити їх функцією? Оскільки це здається очевидним рішенням. Якщо, звичайно, ви не думаєте, що його потрібно буде перезаписати, підклас і т. Д. Якщо так, то найкращі варіанти - попередні відповіді. Пальці, схрещені, я не буду отримувати відмітки за те, що я просто пропоную альтернативне рішення, яке може відповідати чи не задовольняти чиїсь потреби;).

Оскільки правильна відповідь залежатиме від випадку використання коду, про який йде мова;) Насолоджуйтесь

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.