Estoy tratando de implementar la sobrecarga de métodos en Python:
class A:
def stackoverflow(self):
print 'first method'
def stackoverflow(self, i):
print 'second method', i
ob=A()
ob.stackoverflow(2)
pero la salida es second method 2
; similar:
class A:
def stackoverflow(self):
print 'first method'
def stackoverflow(self, i):
print 'second method', i
ob=A()
ob.stackoverflow()
da
Traceback (most recent call last):
File "my.py", line 9, in <module>
ob.stackoverflow()
TypeError: stackoverflow() takes exactly 2 arguments (1 given)
¿Cómo hago para que esto funcione?
python
class
overloading
usuario1335578
fuente
fuente
Respuestas:
Es la sobrecarga de métodos, no la anulación de métodos . Y en Python, lo haces todo en una función:
No puede tener dos métodos con el mismo nombre en Python, y no es necesario.
Consulte la sección Valores de argumento predeterminados del tutorial de Python. Consulte "Menos asombro" y el argumento predeterminado mutable para ver un error común que debe evitarse.
Editar : Consulte PEP 443 para obtener información sobre las nuevas funciones genéricas de despacho único en Python 3.4.
fuente
También puedes usar pythonlangutil :
fuente
En Python, no haces las cosas de esa manera. Cuando las personas hacen eso en lenguajes como Java, generalmente quieren un valor predeterminado (si no lo hacen, generalmente quieren un método con un nombre diferente). Entonces, en Python, puede tener valores predeterminados .
Como puede ver, puede usar esto para desencadenar un comportamiento separado en lugar de simplemente tener un valor predeterminado.
fuente
None
es útil cuando desea un valor predeterminado mutable. El comportamiento separado debe estar en funciones separadas.None
también puede ser útil como un valor predeterminado genuino.No puedes, nunca necesitas y realmente no quieres.
En Python, todo es un objeto. Las clases son cosas, entonces son objetos. Así son los métodos.
Hay un objeto llamado
A
que es una clase. Tiene un atributo llamadostackoverflow
. Solo puede tener uno de esos atributos.Cuando escribe
def stackoverflow(...): ...
, lo que sucede es que crea un objeto que es el método, y lo asigna alstackoverflow
atributo deA
. Si escribe dos definiciones, la segunda reemplaza a la primera, de la misma manera que la asignación siempre se comporta.Además, no desea escribir código que haga el tipo de cosas más salvajes para las que a veces se usa la sobrecarga. Así no es como funciona el lenguaje.
En lugar de tratar de definir una función separada para cada tipo de cosa que se le podría dar (lo cual tiene poco sentido ya que de todos modos no especifica tipos para parámetros de función), deje de preocuparse por qué son las cosas y comience a pensar en lo que pueden hacer .
No solo no puede escribir uno separado para manejar una tupla frente a una lista, sino que tampoco quiere o necesita hacerlo .
Todo lo que debe hacer es aprovechar el hecho de que ambos son, por ejemplo, iterables (es decir, puede escribir
for element in container:
). (El hecho de que no estén directamente relacionados por herencia es irrelevante).fuente
@overload
decorador, diría que "realmente no quiero" es discutible, en el mejor de los casos. De PEP-3124, "... actualmente es un antipatrón común para el código Python inspeccionar los tipos de argumentos recibidos ... la 'forma obvia' de hacerlo es mediante inspección de tipo, pero esto es frágil y está cerrado a extensión ... "Entonces parece que suficientes personas quisieran, que se convirtió en parte de Python.@overload
es solo para escribir.Si bien @agf tenía razón con la respuesta en el pasado ahora con PEP-3124 , obtuvimos nuestro azúcar de sintaxis. Consulte la documentación de mecanografía para obtener detalles sobre
@overload
decorador, pero tenga en cuenta que esto es realmente solo sintaxis de azúcar y, en mi humilde opinión, esto es todo lo que la gente ha estado discutiendo desde entonces. Personalmente estoy de acuerdo que el tener múltiples funciones con diferentes firmas hace que sea más fácil de leer y luego tener una sola función con más de 20 argumentos todo listo para un valor por defecto (None
la mayoría de las veces) y luego tener que tocar el violín alrededor usando un sinfínif
,elif
,else
cadenas para averiguar qué la persona que llama realmente quiere que nuestra función tenga que ver con el conjunto de argumentos proporcionado. Esto se retrasó mucho después del Python Zeny posiblemente también
Directamente de la documentación oficial de Python vinculada anteriormente:
fuente
@overload
no se supone que las funciones ed tengan una implementación real. Esto no es obvio del ejemplo en la documentación de Python.Escribo mi respuesta en Python 3.2.1.
Cómo funciona:
overload
toma cualquier cantidad de callables y las almacena en tuplafunctions
, luego devuelve lambda.functions[number_of_unnamed_args_passed]
llamada con los argumentos pasados a la lambda.Uso:
fuente
Creo que la palabra que estás buscando es "sobrecargar". No hay sobrecarga de métodos en python. Sin embargo, puede utilizar argumentos predeterminados, de la siguiente manera.
Cuando le pase un argumento, seguirá la lógica de la primera condición y ejecutará la primera declaración de impresión. Cuando no le pase argumentos, entrará en la
else
condición y ejecutará la segunda declaración de impresión.fuente
Escribo mi respuesta en Python 2.7:
En Python, la sobrecarga de métodos no es posible; Si realmente desea acceder a la misma función con diferentes características, le sugiero que elija la anulación de métodos.
fuente
En Python, la sobrecarga no es un concepto aplicado. Sin embargo, si está intentando crear un caso en el que, por ejemplo, desea que se realice un inicializador si se pasa un argumento de tipo
foo
y otro inicializador para un argumento de tipobar
, ya que todo en Python se maneja como un objeto, puede verificar el nombre del tipo de clase del objeto pasado y el manejo condicional de escritura basado en eso.Este concepto se puede aplicar a múltiples escenarios diferentes a través de diferentes métodos según sea necesario.
fuente
En Python, haría esto con un argumento predeterminado.
fuente
Acabo de encontrar este https://github.com/bintoro/overloading.py para cualquiera que pueda estar interesado.
Del archivo Léame del repositorio vinculado:
fuente
Python no admite la sobrecarga de métodos como Java o C ++. Podemos sobrecargar los métodos, pero solo podemos usar el último método definido.
Necesitamos proporcionar argumentos opcionales o * args para proporcionar un número diferente de argumentos al llamar.
Cortesía de https://www.geeksforgeeks.org/python-method-overloading/
fuente
Python 3.x incluye una biblioteca de escritura estándar que permite la sobrecarga de métodos con el uso del decorador @overload. Desafortunadamente, esto es para hacer que el código sea más legible, ya que los métodos decorados de sobrecarga necesitarán ser seguidos por un método no decorado que maneje diferentes argumentos. Aquí se puede encontrar más , pero para su ejemplo:
fuente
En el archivo MathMethod.py
En el archivo Main.py
Podemos sobrecargar el método usando multipledispatch
fuente
Python agregó el decorador @overload con PEP-3124 para proporcionar azúcar sintáctica para la sobrecarga mediante inspección de tipo, en lugar de simplemente trabajar con la sobrescritura.
Ejemplo de código sobre sobrecarga a través de @overload desde PEP-3124
es transformado por @ overload-decorator para:
fuente