Estou tentando implementar a sobrecarga de método em Python:
class A:
def stackoverflow(self):
print 'first method'
def stackoverflow(self, i):
print 'second method', i
ob=A()
ob.stackoverflow(2)
mas a saída é second method 2
; similarmente:
class A:
def stackoverflow(self):
print 'first method'
def stackoverflow(self, i):
print 'second method', i
ob=A()
ob.stackoverflow()
dá
Traceback (most recent call last):
File "my.py", line 9, in <module>
ob.stackoverflow()
TypeError: stackoverflow() takes exactly 2 arguments (1 given)
Como eu faço isso funcionar?
python
class
overloading
user1335578
fonte
fonte
Respostas:
É uma sobrecarga de método, não uma substituição de método . E no Python, você faz tudo em uma função:
Você não pode ter dois métodos com o mesmo nome em Python - e não precisa.
Consulte a seção Valores do argumento padrão do tutorial do Python. Consulte "Menos espanto" e o Argumento padrão mutável para evitar um erro comum.
Edit : Veja PEP 443 para obter informações sobre as novas funções genéricas de despacho único no Python 3.4.
fonte
Você também pode usar pythonlangutil :
fonte
No Python, você não faz as coisas dessa maneira. Quando as pessoas fazem isso em linguagens como Java, geralmente desejam um valor padrão (se não o fizerem, geralmente desejam um método com um nome diferente). Portanto, no Python, você pode ter valores padrão .
Como você pode ver, você pode usar isso para acionar um comportamento separado, em vez de apenas ter um valor padrão.
fonte
None
é útil quando você deseja um valor padrão mutável. O comportamento separado deve estar em funções separadas.None
também pode ser útil como um valor padrão genuíno.Você não pode, nunca precisa e realmente não quer.
No Python, tudo é um objeto. Classes são coisas, então são objetos. Então são métodos.
Há um objeto chamado,
A
que é uma classe. Ele tem um atributo chamadostackoverflow
. Só pode ter um desses atributos.Quando você escreve
def stackoverflow(...): ...
, o que acontece é que você cria um objeto que é o método e o atribui aostackoverflow
atributo deA
. Se você escrever duas definições, a segunda substitui a primeira, da mesma maneira que a atribuição sempre se comporta.Além disso, você não deseja escrever um código que faça o tipo mais selvagem de coisas para as quais a sobrecarga às vezes é usada. Não é assim que a linguagem funciona.
Em vez de tentar definir uma função separada para cada tipo de coisa que você poderia receber (o que faz pouco sentido, já que você não especifica tipos para parâmetros de função), pare de se preocupar com o que são as coisas e comece a pensar no que elas podem fazer .
Você não apenas pode escrever um documento separado para lidar com uma tupla versus uma lista, mas também não quer ou precisa .
Tudo o que você faz é aproveitar o fato de que ambos são, por exemplo, iteráveis (ou seja, você pode escrever
for element in container:
). (O fato de eles não estarem diretamente relacionados por herança é irrelevante.)fonte
@overload
decorador, eu diria que "realmente não quero" é discutível, na melhor das hipóteses. No PEP-3124, "... atualmente é um anti-padrão comum para o código Python inspecionar os tipos de argumentos recebidos ... a 'maneira óbvia' de fazer isso é por inspeção de tipo, mas é frágil e fechado para extensão ... "Portanto, parece que muita gente queria, que se tornou parte do Python.@overload
é apenas para digitação.Enquanto @agf estava certo com a resposta no passado, agora com o PEP-3124 , obtivemos nosso açúcar de sintaxe. Veja a documentação de digitação para obter detalhes sobre o
@overload
decorador, mas observe que isso é realmente apenas açúcar sintático e IMHO é sobre isso que todas as pessoas discutem desde então. Pessoalmente concordo que ter múltiplas funções com assinaturas diferentes torna-lo mais legível, em seguida, ter uma única função com mais de 20 argumentos tudo pronto para um valor padrão (None
na maioria das vezes) e depois ter que mexer com intermináveisif
,elif
,else
cadeias para descobrir o que o chamador realmente quer que nossa função tenha relação com o conjunto de argumentos fornecido. Isso estava muito atrasado após o Python Zene sem dúvida também
Diretamente da documentação oficial do Python vinculada acima:
fonte
@overload
funções ed não devem ter nenhuma implementação real. Isso não é óbvio no exemplo da documentação do Python.Eu escrevo minha resposta no Python 3.2.1.
Como funciona:
overload
pega qualquer quantidade de chamadas e as armazena em tuplafunctions
, depois retorna lambda.functions[number_of_unnamed_args_passed]
chamada com argumentos passados para o lambda.Uso:
fonte
Eu acho que a palavra que você está procurando é "sobrecarregar". Não há método de sobrecarga no python. No entanto, você pode usar argumentos padrão, da seguinte maneira.
Quando você passa um argumento, ele segue a lógica da primeira condição e executa a primeira instrução de impressão. Quando você não passa argumentos, ele entra na
else
condição e executa a segunda instrução de impressão.fonte
Escrevo minha resposta em Python 2.7:
No Python, a sobrecarga de método não é possível; se você realmente deseja acessar a mesma função com recursos diferentes, sugiro que você substitua o método.
fonte
No Python, sobrecarregar não é um conceito aplicado. No entanto, se você estiver tentando criar um caso em que, por exemplo, você queira que um inicializador seja executado se for passado um argumento do tipo
foo
e outro inicializador para um argumento do tipobar
, como tudo no Python é tratado como objeto, é possível verificar o nome do tipo de classe do objeto passado e escreva o tratamento condicional com base nisso.Esse conceito pode ser aplicado a vários cenários diferentes através de métodos diferentes, conforme necessário.
fonte
No Python, você faria isso com um argumento padrão.
fonte
Acabei de encontrar este https://github.com/bintoro/overloading.py para qualquer pessoa que possa estar interessada.
No leia-me do repositório vinculado:
fonte
O Python não suporta sobrecarga de métodos como Java ou C ++. Podemos sobrecarregar os métodos, mas podemos usar apenas o método definido mais recente.
Precisamos fornecer argumentos opcionais ou * args para fornecer um número diferente de argumentos na chamada.
Cortesia de https://www.geeksforgeeks.org/python-method-overloading/
fonte
O Python 3.x inclui uma biblioteca de digitação padrão, que permite a sobrecarga de métodos com o uso do decorador @overload. Infelizmente, isso é para tornar o código mais legível, pois os métodos decorados @overload precisarão ser seguidos por um método não decorado que lide com argumentos diferentes. Pode encontrar mais aqui aqui, mas para o seu exemplo:
fonte
No arquivo MathMethod.py
No arquivo Main.py
Podemos sobrecarregar o método usando multipledispatch
fonte
Python adicionou o decorador @overload com o PEP-3124 para fornecer açúcar sintático para sobrecarga via inspeção de tipo - em vez de apenas trabalhar com substituição.
Exemplo de código em sobrecarga via @overload de PEP-3124
é transformado pelo decorador de sobrecarga @ para:
fonte