Jika saya memiliki kelas ...
class MyClass:
def method(arg):
print(arg)
... yang saya gunakan untuk membuat objek ...
my_object = MyClass()
... yang saya sebut method("foo")
seperti itu ...
>>> my_object.method("foo")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: method() takes exactly 1 positional argument (2 given)
... mengapa Python memberitahuku bahwa aku memberikan dua argumen, padahal aku hanya memberikan satu?
self
. Jadi, menyatakandef method(arg):
metode itu salah, seharusnya begitudef method(self, arg):
. Ketika metode pengiriman mencoba untuk memanggilmethod(arg):
dan mencocokkan dua parameterself, arg
terhadapnya, Anda mendapatkan kesalahan itu.Jawaban:
Dengan Python, ini:
... adalah gula sintaksis , yang diterjemahkan oleh penerjemah di belakang layar menjadi:
... yang, seperti yang Anda lihat, memang memiliki dua argumen - hanya saja yang pertama adalah implisit, dari sudut pandang si penelepon.
Ini karena sebagian besar metode melakukan beberapa pekerjaan dengan objek yang mereka panggil, jadi perlu ada beberapa cara agar objek tersebut dirujuk di dalam metode. Dengan konvensi, argumen pertama ini disebut
self
di dalam definisi metode:Jika Anda memanggil
method("foo")
sebuah instanceMyNewClass
, itu berfungsi seperti yang diharapkan:Kadang-kadang (tetapi tidak sering), Anda benar - benar tidak peduli dengan objek yang terikat metode Anda, dan dalam keadaan itu, Anda dapat menghias metode dengan
staticmethod()
fungsi bawaan untuk mengatakannya:... dalam hal ini Anda tidak perlu menambahkan
self
argumen ke definisi metode, dan masih berfungsi:sumber
self
argumen pertama ke metode akan menyelesaikan masalah.Hal lain yang perlu dipertimbangkan ketika jenis kesalahan ini ditemukan:
Saya menemukan pesan kesalahan ini dan menemukan posting ini bermanfaat. Ternyata dalam kasus saya, saya telah menimpa di
__init__()
mana ada objek warisan.Contoh yang diwarisi agak panjang, jadi saya akan beralih ke contoh yang lebih sederhana yang tidak menggunakan warisan:
Hasilnya adalah:
PyCharm tidak menangkap kesalahan ketik ini. Notepad ++ (kekuatan editor / IDE lain) juga tidak.
Memang, ini adalah TypeError "tidak mengambil parameter", itu tidak jauh berbeda dari "punya dua" ketika mengharapkan satu, dalam hal inisialisasi objek dalam Python.
Mengatasi topik: Inisialisasi overloading akan digunakan jika secara sintaksis benar, tetapi jika tidak akan diabaikan dan built-in digunakan sebagai gantinya. Objek tidak akan mengharapkan / menangani ini dan kesalahan dilemparkan.
Dalam kasus kesalahan sytax: Perbaikannya sederhana, cukup edit pernyataan init khusus:
sumber
SyntaxError
disini. Kode secara sintaksis benar; itu dengan tepat mendefinisikan metode bernama___init__
, yang tidak akan pernah dipanggil oleh siapa pun, alih-alih metode khusus__init__
. Itu sebabnya tidak ada kesalahan yang terdeteksi — karena tidak ada yang terdeteksi.Dengan kata-kata sederhana.
Dalam Python Anda harus menambahkan
self
argumen sebagai argumen pertama ke semua metode yang didefinisikan di kelas:Kemudian Anda dapat menggunakan metode Anda sesuai dengan intuisi Anda:
Ini harus menyelesaikan masalah Anda :)
Untuk pemahaman yang lebih baik, Anda juga dapat membaca jawaban atas pertanyaan ini: Apa tujuan diri?
sumber
Pendatang baru di Python, saya mengalami masalah ini ketika saya menggunakan fitur Python
**
dengan cara yang salah. Mencoba memanggil definisi ini dari suatu tempat:menggunakan panggilan tanpa bintang ganda menyebabkan masalah:
Solusinya adalah dengan menambahkan
**
argumen:sumber
*args
(/**kwargs
).Ini terjadi ketika Anda tidak menentukan parameter no
__init__()
atau metode lain yang dicari.Sebagai contoh:
Ketika Anda menjalankan program di atas, itu memberi Anda kesalahan seperti itu:
Bagaimana kita bisa menyingkirkan hal ini?
Cukup berikan parameter,
__init__()
metode apa yang dicarisumber
Anda sebenarnya harus membuat kelas:
sumber
Dalam kasus saya, saya lupa menambahkan
()
Saya memanggil metode seperti ini
Tapi harusnya begini
sumber
Lewati
cls
parameter ke@classmethod
untuk mengatasi masalah ini.sumber