Sekarang sudah jelas apa itu metaclass , ada konsep terkait yang saya gunakan sepanjang waktu tanpa mengetahui apa artinya sebenarnya.
Saya kira semua orang pernah membuat kesalahan dengan tanda kurung, menghasilkan pengecualian "objek tidak dapat dipanggil". Terlebih lagi, menggunakan __init__
dan__new__
menyebabkan bertanya-tanya untuk apa darah ini __call__
dapat digunakan.
Bisakah Anda memberi saya beberapa penjelasan, termasuk contoh dengan metode ajaib?
Jawaban:
Callable adalah apa saja yang bisa dipanggil.
The built-in callable (PyCallable_Check di objects.c) memeriksa apakah argumen adalah baik:
__call__
metode atauMetode yang dinamai
__call__
adalah ( sesuai dengan dokumentasi )Contoh
sumber
callable
benar-benar memberi tahu Anda jika ada sesuatu yang bisa dipanggil atau tidak, saat memeriksa__call__
tidak ada yang memberi tahu Anda; Jika suatu objeko
menyediakan__getattribute__
atau__getattr__
,hasattr(o, '__call__')
dapat mengembalikan True, namuno
masih tidak dapat dipanggil karena Python melompati__getattribute__
dan__getattr__
untuk panggilan. Satu-satunya cara nyata yang tersisa untuk memeriksa apakah ada sesuatu yang dapat dipanggil adalah EAFP.callable()
di Python 3.x : " Fungsi ini pertama kali dihapus di Python 3.0 dan kemudian dibawa kembali dengan Python 3.2. ".tp_call
diperiksa. Lihat implementasi PyCallable_Check , ini 3 baris.Dari sumber Python objek.c :
Ia mengatakan:
__call__
atribut.x
itu bisa dipanggil iffx->ob_type->tp_call != NULL
Desciption dari
tp_call
bidang :Anda selalu dapat menggunakan
callable
fungsi bawaan untuk menentukan apakah objek yang diberikan dapat dipanggil atau tidak; atau lebih baik lagi panggil saja dan tangkapTypeError
nanti.callable
dihapus dalam Python 3.0 dan 3.1, gunakancallable = lambda o: hasattr(o, '__call__')
atauisinstance(o, collections.Callable)
.Contoh, implementasi cache yang disederhanakan:
Pemakaian:
Contoh dari perpustakaan standar, file
site.py
, definisi built-inexit()
danquit()
fungsi:sumber
def f(): ...
, dan kelas objek seperticlass C: ...
yaitu,f
,''.strip
,len
, danC
semua callable. Contoh yang memiliki__call__()
metode di kelas mereka relatif jarang.Callable adalah objek yang memungkinkan Anda untuk menggunakan kurung bulat () dan akhirnya melewati beberapa parameter, seperti fungsi.
Setiap kali Anda mendefinisikan fungsi, python membuat objek yang bisa dipanggil. Sebagai contoh, Anda bisa mendefinisikan fungsi func dengan cara ini (sama saja):
Anda bisa menggunakan metode ini daripada metode seperti doit atau run , saya pikir itu lebih jelas untuk melihat obj () daripada obj.doit ()
sumber
Biarkan saya jelaskan mundur:
Pertimbangkan ini ...
... sebagai gula sintaksis untuk:
Di mana
foo
bisa ada objek yang merespons__call__
. Ketika saya mengatakan objek apa pun, maksud saya adalah: tipe bawaan, kelas Anda sendiri, dan instance mereka.Dalam hal tipe bawaan, saat Anda menulis:
Anda pada dasarnya melakukan:
Itu juga mengapa Anda tidak memiliki
foo = new int
dalam Python: Anda hanya membuat objek kelas mengembalikan turunannya__call__
. Cara Python memecahkan ini sangat elegan menurut saya.sumber
type(int).__call__(int, '10')
dantype(unicode).__call__(unicode, '10')
. Dunders selalu dipanggil di kelas mereka, bukan melalui instance. Dan mereka juga tidak pernah melewati metaclass. Untuk sebagian besar kasus, itu hanya nitpick, tetapi terkadang penting.A Callable adalah objek yang memiliki
__call__
metode. Ini berarti Anda dapat memalsukan fungsi yang dapat dipanggil atau melakukan hal-hal yang rapi seperti Aplikasi Fungsi Parsial di mana Anda mengambil fungsi dan menambahkan sesuatu yang meningkatkannya atau mengisi beberapa parameter, mengembalikan sesuatu yang dapat dipanggil secara bergiliran (dikenal sebagai Currying) di lingkaran pemrograman fungsional) ).Kesalahan tipografi tertentu akan membuat penerjemah berusaha memanggil sesuatu yang tidak Anda inginkan, seperti (misalnya) string. Ini dapat menghasilkan kesalahan ketika penerjemah mencoba untuk menjalankan aplikasi yang tidak dapat dipanggil. Anda dapat melihat ini terjadi dalam juru bahasa python dengan melakukan sesuatu seperti transkrip di bawah ini.
sumber
__call__
membuat objek apa pun bisa dipanggil sebagai fungsi.Contoh ini akan menampilkan 8:
sumber
Sederhananya, "callable" adalah sesuatu yang bisa disebut seperti metode. Fungsi bawaan "callable ()" akan memberi tahu Anda apakah ada sesuatu yang tampaknya dapat dipanggil, seperti halnya memeriksa properti panggilan . Fungsi dapat dipanggil seperti halnya kelas, instance kelas dapat dipanggil. Lihat lebih lanjut tentang ini di sini dan di sini .
sumber
Dalam Python, callable adalah objek yang jenisnya memiliki
__call__
metode:Sesimpel itu :)
Ini tentu saja dapat kelebihan beban:
sumber
Untuk memeriksa fungsi atau metode kelas apakah dapat dipanggil atau tidak, itu berarti kita dapat memanggil fungsi itu.
sumber
callable(obj.__init___)
tidak memiliki garis bawah ekstra (seperti di AttributeError)? Jika tidak, apakah Anda yakin jawabannya bukanTrue
untuk yang itu?Ini adalah sesuatu yang Anda dapat menempatkan "(args)" setelah dan berharap itu berfungsi. Callable biasanya merupakan metode atau kelas. Metode dipanggil, kelas akan dipakai.
sumber
callable menerapkan
__call__
metode khusus sehingga objek apa pun dengan metode seperti itu dapat dipanggil.sumber
__call__
tidak akan dapat dipanggil jika kelas tidak mendefinisikan metode seperti itu.Callable adalah jenis atau kelas "Fungsi atau Metode Bangun" dengan pemanggilan metode
Contoh: cetak adalah objek yang bisa dipanggil. Dengan fungsi bawaan __call__ Saat Anda menjalankan fungsi cetak , Python membuat objek tipe cetak dan memanggil metode __call__ dengan meneruskan parameter jika ada.
Terima kasih. Salam, Maris
sumber
print
fungsi, Python membuat objek tipe cetak dan memanggil metode__call__
". Python tidak membuat objek cetak. Itu hanya menyebut sesuatu yang setara dengantype(print).__call__(print, *args, **kwargs)
. Dan kalimat pertama tidak masuk akal. Anda tampaknya membingungkan objek yang bisa dipanggil dan "dapat dipanggil" fungsinya.