2015-04-13 3 views
2

Основываясь на том, что я читал, методы класса во многом аналогичны статическим методам с несколькими исключениями, но имеют преимущество предоставления указателя класса.python: Когда использовать метод static method over class?

В результате существует ли какая-либо причина использования статических методов над методами класса, если в классе определен метод не-экземпляра?

Редактировать: Поскольку некоторые из вас быстро отклоняют это как дубликат к другому вопросу. Это не вопрос о различии между классом и статическими методами. Скорее, речь идет о том, как решить их в подавляющем большинстве случаев, когда их функциональность перекрывается.

Редактировать # 2: Причина, по которой я прошу, заключается в том, что я рефакторинг существующего кода от других людей. В частности, существуют дочерние классы, которые используют те же модули, что и родительский, и я намерен переместить их в отдельные модули. Когда это происходит, необходимо зафиксировать ссылки на внеклассовые константы в статических методах. Я могу сделать это одним из следующих способов: 0 Импортировать все константы из родительского модуля 2. Переместить все константы в родительский класс и изменить все дочерние статические методы методам класса 3. Добавьте «ParentClass. " перед каждой ссылкой на константы

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

+1

Вы читали [* ЭТО *] (http://stackoverflow.com/questions/136097/what-is-the-difference-between-staticmethod-and-classmethod-in-python)? – Anzel

+0

Да, прочитайте мое редактирование. – user1836155

+0

Я не использовал дубликат, поскольку я знаю, что вы пытаетесь спросить о * WHEN *, однако, как вы не упомянули * ЧТО * вы прочитали, поэтому я разместил комментарий, просто пытаясь помочь. – Anzel

ответ

5

Практически всегда, фактически. Вам редко нужен доступ к объекту класса, который автоматически передается методу класса. Методы класса Python (которые не должны сравниваться с методами класса на языке Java, как правило, предназначены для использования альтернативных конструкторов.

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

@classmethod 
def my_class_method(cls, foo): 
    ... 

Если вы никогда не использовать cls в теле метода, вы можете сначала изменить его

@staticmethod 
def my_static_method(foo): 
    ... 

Далее, вы могли бы подумайте, действительно ли my_static_method должен быть частью класса и может ли он быть автономной функцией.

Если вы do используете cls, то, очевидно, это должен быть метод класса.

+0

Я думаю, что я не согласен с этим, но примеры, которые бросаются в глаза, происходят из Django, где я все время объявляю «classmethod's на моделях», чтобы иметь доступ к переменным класса и когда функциональность должна не привязаны к экземпляру. С другой стороны, я считаю, что «staticmethod's - это странный способ сказать», вот функция, которую я собираюсь произвольно объединить с этим другим материалом ». Разумеется, это все мнение от кого-то, кто не может быть полностью квалифицирован для комментариев. – erewok

+0

Я должен, вероятно, изменить «редко нужно» на «если вам не нужно». – chepner

+0

Хм, это противоположность тому, что я ожидаю. Я рад, что спросил. – user1836155