В чате была дискуссия, касающаяся вопроса (сам вопрос не имеет отношения к этому), который показал, что я, возможно, вообще не знаю Python.
На мой взгляд, хотя терминология отличается в разных языках, мы можем классифицировать функции следующим образом:
- [бесплатные] функции
- статические методы / статические функции-члены
- нестатические методы / нестатические функции-члены
По-видимому, в Python есть функция другого типа, которая не вписывается в вышеупомянутые категории, та, которая является методом, но «не знает своего класса».
Что такое "методы класса" и "методы экземпляра" в Python?
python
terminology
Гонки легкости с Моникой
источник
источник
Ответы:
Краткий ответ
Длинный ответ
Методы класса
Метод класса является тот , который принадлежит к классу в целом. Это не требует экземпляра. Вместо этого класс будет автоматически отправлен в качестве первого аргумента. Метод класса объявлен с
@classmethod
декоратором.Например:
Методы экземпляра
С другой стороны, метод экземпляра требует экземпляр для его вызова и не требует декоратора. Это, безусловно, самый распространенный тип метода.
(примечание: выше с python3; с python2 вы получите немного другую ошибку)
Статические методы
Статический метод похож на метод класса, но не получите объект класса в качестве автоматического параметра. Он создан с помощью
@staticmethod
декоратора.Ссылки на документацию
Вот ссылки на соответствующий документ python3:
В документации модели данных есть что сказать о разнице между методами класса и статическими методами:
Смежные вопросы
источник
"^ def("
, затем пересчитал все экземпляры@staticmethod
. Очень ненаучно, но, вероятно, было в рамках.«Метод экземпляра» использует информацию, содержащуюся в экземпляре, чтобы выяснить, какое значение вернуть (или какой побочный эффект нужно сделать). Это очень распространено.
«Метод класса» использует информацию о классе (а не об экземпляре этого класса), чтобы повлиять на то, что он делает (они обычно используются для создания новых экземпляров в качестве альтернативных конструкторов и, следовательно, не являются невероятно распространенными).
«Статический метод» не использует никакой информации о классе или экземпляре для вычисления того, что он делает. Обычно это просто в классе для удобства. (Как таковые, они тоже не очень распространены.)
Функция Х
Помните математический класс, "у есть функция х
f(x)
,?" Давайте применим это в коде:Под вышесказанным подразумевается, что поскольку
x
могут меняться,y
могут меняться приx
изменениях. Это то, что подразумевается, когда мы говорим, что "y
является функциейx
"Что будет
y
когдаz
есть1
?2
?'FooBarBaz'
?y
не является функциейz
, поэтомуz
может быть чем угодно и не влиять на результат функции, предполагая, что наша функцияfunction
является чистой. (Если он обращаетсяz
как к глобальной переменной, то это не чистая функция - это то, что подразумевается под функциональной чистотой.)Помните вышеупомянутое, читая следующие описания:
Методы экземпляра
Метод экземпляра является функцией , которая является функцией от экземпляра . Функция неявно принимает экземпляр в качестве аргумента, и экземпляр используется функцией для определения выходных данных функции.
Встроенным примером метода экземпляра является str.lower:
str.lower
вызывается для экземпляра строки и использует информацию, содержащуюся в экземпляре, чтобы выяснить, какую новую строку возвращать.Методы класса:
Помните, в Python все является объектом. Это означает, что класс является объектом и может быть передан в качестве аргумента функции.
Метод класса является функцией , которая является функцией от класса . Он принимает класс в качестве аргумента.
Встроенный пример
dict.fromkeys
:Функция неявно знает свой собственный класс, функция использует этот класс для воздействия на выходные данные функции и создает новый из этого класса из итерируемого. OrderedDict демонстрирует это при использовании того же метода:
Метод класса использует информацию о классе (а не об экземпляре этого класса), чтобы повлиять на тип возвращаемого класса.
Статические Методы
Вы упоминаете метод, который «не знает своего класса» - это статический метод в Python. Это просто присоединено для удобства к объекту класса. При желании это может быть отдельная функция в другом модуле, но ее сигнатура вызова будет такой же.
Статический метод не является функцией ни класса, ни объекта.
Встроенным примером статического метода является str.maketrans из Python 3.
Учитывая пару аргументов, он создает словарь, который не является функцией своего класса.
Это удобно, потому что
str
всегда доступно в глобальном пространстве имен, поэтому вы можете легко использовать его с функцией перевода:В Python 2 вы должны получить к нему доступ из
string
модуля:пример
Давайте создадим:
Теперь экземпляр может вызывать все методы:
Но обычно класс не предназначен для вызова метода экземпляра, хотя ожидается, что он вызовет другие:
Вы должны были бы явно передать экземпляр для вызова метода экземпляра:
источник
MyClass(1,2,3)
а не как,MyClass.get_special(1,2,3)
) и статический метод как просто быть нормальной функцией, которая в любом случае может стоять одна.«Метод экземпляра» - это метод, который передается объекту экземпляра в качестве первого параметра, который по соглашению вызывается
self
. Это по умолчанию.«Статический метод» - это метод без начального
self
параметра. Это реализовано с помощью декоратора @staticmethod .«Метод класса» - это метод, в котором начальный параметр является не объектом экземпляра, а объектом класса ( см. Эту часть документации по Python, что такое «объект класса»), который по соглашению называется
cls
. Это реализовано с помощью декоратора @classmethod .Типичное использование термина «статический метод» в C / C ++ / etc относится как к методам Python «статический», так и к методам «класс» Python, так как оба этих типа методов не имеют ссылки на экземпляр. В C / C ++ / etc методы обычно имеют неявный доступ ко всем элементам / методам класса, не относящимся к экземпляру, поэтому, вероятно, такое различие существует только в таких языках, как Python / Ruby / etc.
источник
Class::staticMethod()
и все (если вам не запрещено звонить, потому чтоstaticMethod()
это личное или что-то в этом роде).