Ha habido una discusión en el chat relacionada con una pregunta (la pregunta en sí misma es irrelevante para esta), que ha revelado que quizás no conozca Python en absoluto.
En mi opinión, aunque la terminología difiere entre idiomas, generalmente podemos clasificar las funciones como:
- funciones [gratis]
- métodos estáticos / funciones miembro estáticas
- métodos no estáticos / funciones miembro no estáticas
Aparentemente, en Python hay otro tipo de función que no encaja en las categorías anteriores, una que es un método pero "no conoce su clase".
¿Qué son los "métodos de clase" y los "métodos de instancia" en Python?
python
terminology
La ligereza corre con Mónica
fuente
fuente
Respuestas:
La respuesta corta
La respuesta larga
Métodos de clase
Un método de clase es uno que pertenece a la clase como un todo. No requiere una instancia. En cambio, la clase se enviará automáticamente como primer argumento. Se declara un método de clase con el
@classmethod
decorador.Por ejemplo:
Métodos de instancia
Por otro lado, un método de instancia requiere una instancia para llamarlo y no requiere decorador. Este es, con mucho, el tipo de método más común.
(nota: lo anterior es con python3; con python2 obtendrá un error ligeramente diferente)
Métodos estáticos
Un método estático es similar a un método de clase, pero no obtendrá el objeto de clase como un parámetro automático. Se crea utilizando el
@staticmethod
decorador.Enlaces de documentación
Aquí hay enlaces a la documentación relevante de python3:
La documentación del modelo de datos tiene esto que decir sobre la diferencia entre los métodos de clase y los métodos estáticos:
Preguntas relacionadas
fuente
"^ def("
, luego conté todas las instancias de@staticmethod
. Muy poco científico, pero probablemente estaba dentro del estadio.Un "método de instancia" utiliza la información contenida en la instancia para determinar qué valor devolver (o qué efecto secundario hacer). Estos son muy comunes.
Un "método de clase" usa información sobre la clase (y no una instancia de esa clase) para afectar lo que hace (se usan generalmente para crear nuevas instancias como constructores alternativos, y por lo tanto no son increíblemente comunes).
Un "método estático" no utiliza ninguna información sobre la clase o instancia para calcular lo que hace. Por lo general, es solo en la clase por conveniencia. (Como tal, estos tampoco son muy comunes).
Una función de X
Recuerde la clase de matemáticas, "y es una función de x
f(x)
,?" Apliquemos eso en el código:Implícito en lo anterior es que, dado que
x
puede cambiar,y
puede cambiar cuandox
cambia. Esto es lo que significa cuando decimos que "y
es una función dex
"¿Qué será
y
cuandoz
sea1
?2
?'FooBarBaz'
?y
no es una función dez
, por lo quez
puede ser cualquier cosa y no afectar el resultado de la función suponiendo que nuestrafunction
es una función pura. (Si accedez
como una variable global, entonces no es una función pura, esto es lo que se entiende por pureza funcional).Tenga en cuenta lo anterior mientras lee las siguientes descripciones:
Métodos de instancia
Un método de instancia es una función que es función de una instancia . La función acepta la instancia implícitamente como un argumento, y la instancia la utiliza para determinar el resultado de la función.
Un ejemplo incorporado de un método de instancia es str.lower:
str.lower
se llama en la instancia de la cadena y usa la información contenida en la instancia para determinar qué nueva cadena devolver.Métodos de clase:
Recuerde, en Python, todo es un objeto. Eso significa que la clase es un objeto y se puede pasar como argumento a una función.
Un método de clase es una función que es una función de la clase . Acepta la clase como un argumento para ello.
Un ejemplo incorporado es
dict.fromkeys
:La función conoce implícitamente su propia clase, la función utiliza la clase para afectar la salida de la función y crea una nueva de esa clase a partir del iterable. Un OrderedDict demuestra esto cuando se usa el mismo método:
El método de clase utiliza información sobre la clase (y no una instancia de esa clase) para afectar qué tipo de clase devolver.
Métodos Estáticos
Usted menciona un método que "no conoce su clase"; este es un método estático en Python. Simplemente se adjunta por conveniencia al objeto de clase. Opcionalmente, podría ser una función separada en otro módulo, pero su firma de llamada sería la misma.
Un método estático no es función de la clase ni del objeto.
Un ejemplo incorporado de un método estático es str.maketrans de Python 3.
Dado un par de argumentos, crea un diccionario que no es una función de su clase.
Es conveniente porque
str
siempre está disponible en el espacio de nombres global, por lo que puede usarlo fácilmente con la función de traducción:En Python 2, debe acceder desde el
string
módulo:Ejemplo
Vamos a instanciar:
Ahora la instancia puede llamar a todos los métodos:
Pero la clase generalmente no tiene la intención de llamar al método de instancia, aunque se espera que llame a los demás:
Tendría que pasar explícitamente la instancia para llamar al método de instancia:
fuente
MyClass(1,2,3)
sino más bien comoMyClass.get_special(1,2,3)
), y un método estático como solo siendo una función normal que podría estar sola de todos modos.Un "método de instancia" es un método que pasa el objeto de instancia como su primer parámetro, que por convención se llama
self
. Este es el valor predeterminado.Un "método estático" es un método sin el
self
parámetro inicial . Esto se implementa con el decorador @staticmethod .Un "método de clase" es un método en el que el parámetro inicial no es un objeto de instancia, sino el objeto de clase ( consulte esta parte de los documentos de Python para saber qué es un "objeto de clase"), que por convención se llama
cls
. Esto se implementa con el decorador @classmethod .El uso típico del término "método estático" en C / C ++ / etc se aplica tanto a los métodos "estáticos" como a la "clase" de Python, ya que ambos tipos de métodos carecen de una referencia a la instancia. En C / C ++ / etc, los métodos normalmente tienen acceso implícito a todos los miembros / métodos que no son de instancia de la clase, por lo que probablemente esta distinción solo existe en lenguajes como Python / Ruby / etc.
fuente
Class::staticMethod()
y listo (siempre y cuando no tenga prohibido llamarlo porquestaticMethod()
es privado o algo así).