Dalam Python, saya mencoba menjalankan metode di kelas dan saya mendapatkan kesalahan:
Traceback (most recent call last):
File "C:\Users\domenico\Desktop\py\main.py", line 8, in <module>
fibo.f()
TypeError: unbound method f() must be called with fibo instance
as first argument (got nothing instead)
Kode: (swineflu.py)
class fibo:
a=0
b=0
def f(self,a=0):
print fibo.b+a
b=a;
return self(a+1)
Script main.py
import swineflu
f = swineflu
fibo = f.fibo
fibo.f() #TypeError is thrown here
Apa artinya kesalahan ini? Apa yang menyebabkan kesalahan ini?
fibo = f.fibo()
Perlu instanciate kelas dengan tanda kurung.fibo().f()
Jawaban:
OKE, pertama-tama, Anda tidak harus mendapatkan referensi ke modul ke nama yang berbeda; Anda sudah memiliki referensi (dari
import
) dan Anda bisa menggunakannya. Jika Anda ingin nama yang berbeda, gunakan sajaimport swineflu as f
.Kedua, Anda mendapatkan referensi ke kelas daripada membuat instance kelas.
Jadi ini seharusnya:
Sebuah metode terikat adalah salah satu yang melekat ke sebuah contoh dari sebuah objek. Sebuah metode terikat , tentu saja, salah satu yang tidak melekat ke sebuah contoh. Kesalahan biasanya berarti Anda memanggil metode pada kelas daripada pada contoh, yang persis apa yang terjadi dalam kasus ini karena Anda belum membuat instance kelas.
sumber
swineflu.fibo().f()
jika Anda hanya memanggilnya sekali.Cara mereproduksi kesalahan ini dengan sesedikit mungkin baris:
Gagal karena TypeError karena Anda tidak instantiate kelas pertama, Anda memiliki dua pilihan: 1: membuat metode statis sehingga Anda dapat menjalankannya dengan cara statis, atau 2: instantiate kelas Anda sehingga Anda memiliki instance untuk mengambil ke, untuk menjalankan metode.
Sepertinya Anda ingin menjalankan metode dengan cara statis, lakukan ini:
Atau, yang mungkin Anda maksudkan adalah menggunakan instantiated instance seperti ini:
Jika ini membingungkan Anda, ajukan pertanyaan-pertanyaan ini:
sumber
fibo = f.fibo
referensi kelas itu sendiri. Anda mungkin inginfibo = f.fibo()
(perhatikan tanda kurung) untuk membuat instance kelas, setelah itufibo.f()
harus berhasil dengan benar.f.fibo.f()
gagal karena Anda pada dasarnya meneleponf(self, a=0)
tanpa menyediakanself
;self
"terikat" secara otomatis ketika Anda memiliki instance kelas.sumber
f
adalah metode (contoh). Namun, Anda memanggilnya viafibo.f
, di manafibo
objek kelas. Karenanya,f
tidak terikat (tidak terikat pada turunan kelas apa pun).Jika Anda melakukannya
maka itu
f
terikat (ke instancea
).sumber
Berikut ini adalah tutorial yang bagus untuk memulai dengan kelas dalam Python.
sumber
Dalam Python 2 (3 memiliki sintaks yang berbeda):
Bagaimana jika Anda tidak dapat membuat instance kelas Induk Anda sebelum Anda perlu memanggil salah satu metodenya?
Gunakan
super(ChildClass, self).method()
untuk mengakses metode induk.sumber
Perbedaan dalam versi In python 2 dan 3:
Jika Anda sudah memiliki metode default di kelas dengan nama yang sama dan Anda menyatakan kembali sebagai nama yang sama itu akan muncul sebagai panggilan metode-tidak terikat dari instance kelas itu ketika Anda ingin instantiated.
Jika Anda menginginkan metode kelas, tetapi Anda mendeklarasikannya sebagai metode instan.
Metode instance adalah metode yang digunakan saat untuk membuat instance dari kelas.
Contohnya adalah
Metode label kelas:
Dalam versi python 2 dan 3 berbeda kelas @classmethod untuk menulis dalam python 3 secara otomatis mendapatkan itu sebagai metode kelas-label dan tidak perlu menulis @classmethod Saya pikir ini mungkin membantu Anda.
sumber
Coba ini. Untuk python 2.7.12 kita perlu mendefinisikan konstruktor atau perlu menambahkan diri ke setiap metode diikuti dengan mendefinisikan sebuah instance dari objek yang disebut kelas.
sumber