Se eu tiver uma aula ...
class MyClass:
def method(arg):
print(arg)
... que eu uso para criar um objeto ...
my_object = MyClass()
... no qual eu chamo method("foo")
assim ...
>>> my_object.method("foo")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: method() takes exactly 1 positional argument (2 given)
... por que o Python me disse que eu dei dois argumentos, quando eu só dei um?
self
. Portanto, declarardef method(arg):
está errado para um método, deveria estardef method(self, arg):
. Quando o despacho do método tenta chamarmethod(arg):
e combinar dois parâmetrosself, arg
, você recebe esse erro.Respostas:
Em Python, isso:
... é açúcar sintático , que o intérprete traduz nos bastidores em:
... que, como você pode ver, realmente tem dois argumentos - é apenas o primeiro que está implícito, do ponto de vista do chamador.
Isso ocorre porque a maioria dos métodos trabalha com o objeto em que é chamado, portanto, é necessário que haja alguma maneira de referir esse objeto dentro do método. Por convenção, esse primeiro argumento é chamado
self
dentro da definição do método:Se você chamar
method("foo")
uma instância deMyNewClass
, ela funcionará conforme o esperado:Ocasionalmente (mas não com freqüência), você realmente não se importa com o objeto ao qual seu método está vinculado e, nessa circunstância, pode decorar o método com a
staticmethod()
função interna para dizer isso:... nesse caso, você não precisa adicionar um
self
argumento à definição do método, e ele ainda funciona:fonte
self
como primeiro argumento ao método resolve o problema.Outra coisa a considerar quando esse tipo de erro é encontrado:
Eu estava encontrando esta mensagem de erro e achei esta postagem útil. Acontece que, no meu caso, eu havia substituído um local
__init__()
onde havia herança de objeto.O exemplo herdado é bastante longo, então vou pular para um exemplo mais simples que não usa herança:
O resultado é:
PyCharm não pegou esse erro de digitação. Nem o Notepad ++ (outros editores / IDEs).
Concedido, este é um TypeError "sem parâmetros", não é muito diferente de "obteve dois" ao esperar um, em termos de inicialização de objeto em Python.
Abordando o tópico: Um inicializador de sobrecarga será usado se sintaticamente correto, mas, caso contrário, será ignorado e o incorporado será usado. O objeto não espera / lida com isso e o erro é gerado.
No caso do erro de sintaxe: A correção é simples, basta editar a instrução init customizada:
fonte
SyntaxError
aqui. O código está sintaticamente correto; apenas define corretamente um método chamado___init__
, que ninguém jamais chamará, em vez do método especial__init__
. É por isso que nenhum erro é detectado - porque não há um para detectar.Em palavras simples.
No Python, você deve adicionar
self
argumento como o primeiro argumento a todos os métodos definidos nas classes:Então você pode usar seu método de acordo com sua intuição:
Isso deve resolver seu problema :)
Para uma melhor compreensão, você também pode ler as respostas para esta pergunta: Qual é o propósito de si mesmo?
fonte
Iniciante no Python, tive esse problema quando estava usando o recurso do Python de
**
maneira errada. Tentando chamar essa definição de algum lugar:o uso de uma chamada sem estrela dupla estava causando o problema:
A solução é adicionar
**
ao argumento:fonte
*args
(/**kwargs
).Isso ocorre quando você não especifica o número de parâmetros
__init__()
ou qualquer outro método procurando.Por exemplo:
Quando você executa o programa acima, ocorre um erro assim:
Como podemos nos livrar dessa coisa?
Basta passar os parâmetros, que
__init__()
método procurafonte
Você realmente deve criar uma classe:
fonte
No meu caso, esqueci de adicionar o
()
Eu estava chamando o método assim
Mas deveria ser assim
fonte
Passe o
cls
parâmetro para@classmethod
para resolver esse problema.fonte