Jeśli mam klasę ...
class MyClass:
def method(arg):
print(arg)
... którego używam do stworzenia obiektu ...
my_object = MyClass()
... na które tak nazywam method("foo")
...
>>> my_object.method("foo")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: method() takes exactly 1 positional argument (2 given)
... dlaczego Python mówi mi, że podałem mu dwa argumenty, skoro podałem tylko jeden?
self
. Dlatego deklarowaniedef method(arg):
jest niewłaściwe dla metody, powinno byćdef method(self, arg):
. Gdy metoda wysyłki próbuje wywołaćmethod(arg):
i dopasować do niego dwa parametryself, arg
, pojawia się ten błąd.Odpowiedzi:
W Pythonie to:
... to cukier składniowy , który tłumacz tłumaczy za kulisami na:
... które, jak widać, rzeczywiście mają dwa argumenty - po prostu pierwszy jest niejawny z punktu widzenia osoby dzwoniącej.
Wynika to z faktu, że większość metod działa w pewien sposób z obiektem, do którego zostały wywołane, dlatego musi istnieć sposób, aby do obiektu można było się odwoływać w ramach metody. Zgodnie z konwencją pierwszy argument jest wywoływany
self
w definicji metody:Wywołanie
method("foo")
instancjiMyNewClass
działa zgodnie z oczekiwaniami:Czasami (ale nie często) tak naprawdę nie obchodzi cię obiekt, do którego twoja metoda jest zobowiązana, iw takiej sytuacji możesz udekorować metodę za pomocą wbudowanej
staticmethod()
funkcji, aby powiedzieć:... w takim przypadku nie trzeba dodawać
self
argumentu do definicji metody i nadal działa:źródło
self
pierwszego argumentu do metody rozwiązuje problem.Coś innego, co należy wziąć pod uwagę przy napotkaniu tego rodzaju błędu:
Napotkałem ten komunikat o błędzie i uznałem ten post za pomocny. Okazuje się, że w moim przypadku zastąpiłem
__init__()
dziedziczenie obiektów.Dziedziczony przykład jest raczej długi, więc przejdę do prostszego przykładu, który nie korzysta z dziedziczenia:
Wynik to:
PyCharm nie złapał tej literówki. Notepad ++ też (inne edytory / IDE mogą).
To prawda, TypeError „nie przyjmuje parametrów”, nie różni się niczym od „dostania dwóch”, gdy oczekuje się jednego, pod względem inicjalizacji obiektu w Pythonie.
Zajmując się tym tematem: Inicjator przeciążenia zostanie użyty, jeśli jest poprawny pod względem składniowym, ale jeśli nie, zostanie zignorowany i zamiast tego zostanie użyty wbudowany. Obiekt nie oczekuje / nie obsłuży tego, a błąd zostanie zgłoszony.
W przypadku błędu sytax: Poprawka jest prosta, wystarczy edytować niestandardową instrukcję init:
źródło
SyntaxError
. Kod jest poprawny pod względem składniowym; po prostu poprawnie definiuje nazwaną metodę___init__
, której nikt nigdy nie wywoła, zamiast metody specjalnej__init__
. Dlatego nie wykryto żadnego błędu - ponieważ nie ma jednego do wykrycia.W prostych słowach.
W Pythonie powinieneś dodać
self
argument jako pierwszy argument do wszystkich zdefiniowanych metod w klasach:Następnie możesz użyć metody zgodnie ze swoją intuicją:
To powinno rozwiązać twój problem :)
Aby lepiej zrozumieć, możesz także przeczytać odpowiedzi na to pytanie: Jaki jest cel siebie?
źródło
Nowicjusz w Pythonie, miałem ten problem, gdy
**
niewłaściwie korzystałem z funkcji Pythona . Próbuję wywołać gdzieś tę definicję:używanie połączenia bez podwójnej gwiazdki powodowało problem:
Rozwiązaniem jest dodanie
**
do argumentu:źródło
*args
(/**kwargs
).Występuje, gdy nie określisz liczby parametrów
__init__()
ani żadnej innej szukanej metody.Na przykład:
Po uruchomieniu powyższego programu pojawia się taki błąd:
Jak możemy się tego pozbyć?
Wystarczy przekazać parametry, jakiej
__init__()
metody szukaszźródło
Powinieneś stworzyć klasę:
źródło
W moim przypadku zapomniałem dodać
()
Nazywałem tę metodę w ten sposób
Ale tak powinno być
źródło
Przekaż
cls
parametr do,@classmethod
aby rozwiązać ten problem.źródło