Saya tahu bahwa python memiliki len()
fungsi yang digunakan untuk menentukan ukuran string, tetapi saya bertanya-tanya mengapa itu bukan metode objek string.
Memperbarui
Oke, saya sadar saya salah. __len__()
sebenarnya adalah metode objek string. Tampaknya aneh melihat kode berorientasi objek dengan Python menggunakan fungsi len pada objek string. Lebih jauh lagi, itu juga aneh untuk melihat __len__
sebagai nama bukan hanya len.
len
. Mereka berpikir bahwa lebih mudah untuk memaksa orang untuk mengimplementasikan.__len__
daripada memaksa orang untuk menerapkan.len()
. Itu hal yang sama, dan yang terlihat jauh lebih bersih. Jika bahasanya akan memiliki OOP__len__
, apa tujuan dunia inilen(..)
__iter__
, atau hanya dengan__getitem__
, daniter(x)
akan berfungsi dengan baik. Anda dapat membuat objek konteks yang dapat digunakan dengan__bool__
atau__len__
, danbool(x)
akan bekerja dengan baik. Dan seterusnya. Saya pikir Armin menjelaskan hal ini dengan cukup baik di posting terkait - tetapi bahkan jika dia tidak, memanggil Python bodoh karena penjelasan luar oleh seorang pria yang sering secara publik berselisih dengan para dev inti tidak akan adil ...zip
adalah fungsi tingkat atas, bukanzip_with
metode. Dan seterusnya. Hanya karena segala sesuatu adalah objek tidak berarti menjadi objek adalah hal yang paling penting tentang setiap hal.Jawaban Jim untuk pertanyaan ini dapat membantu; Saya salin di sini. Mengutip Guido van Rossum:
sumber
Ada
len
metode:sumber
Python adalah bahasa pemrograman pragmatis, dan alasan untuk
len()
menjadi fungsi dan bukan metodestr
,list
,dict
dll pragmatis.Fungsi
len()
bawaan berurusan langsung dengan tipe bawaan: implementasi CPythonlen()
sebenarnya mengembalikan nilaiob_size
bidang dalamPyVarObject
C struct yang mewakili objek bawaan berukuran variabel dalam memori. Ini jauh lebih cepat daripada memanggil metode - tidak perlu pencarian atribut. Mendapatkan jumlah item dalam koleksi adalah operasi umum dan harus bekerja secara efisien untuk tipe dasar dan beragam sepertistr
,list
,array.array
dllNamun, untuk mempromosikan konsistensi, saat melamar
len(o)
ke tipe yang ditentukan pengguna, Python memanggilo.__len__()
sebagai fallback.__len__
,__abs__
dan semua metode khusus lainnya yang didokumentasikan dalam Model Data Python memudahkan untuk membuat objek yang berperilaku seperti bawaan, memungkinkan API ekspresif dan sangat konsisten yang kita sebut "Pythonic".Dengan menerapkan metode khusus, objek Anda dapat mendukung iterasi, membebani operator infiks, mengelola konteks dalam
with
blok, dll. Anda dapat menganggap Model Data sebagai cara menggunakan bahasa Python itu sendiri sebagai kerangka kerja di mana objek yang Anda buat dapat diintegrasikan dengan mulus.Alasan kedua, didukung oleh kutipan dari Guido van Rossum seperti ini , adalah lebih mudah untuk membaca dan menulis
len(s)
daripadas.len()
.Notasi
len(s)
konsisten dengan operator unary dengan notasi awalan, sepertiabs(n)
.len()
digunakan lebih sering daripadaabs()
, dan layak untuk mudah ditulis.Mungkin juga ada alasan historis: dalam bahasa ABC yang mendahului Python (dan sangat berpengaruh dalam desainnya), ada operator unary yang ditulis sebagaimana
#s
dimaksudlen(s)
.sumber
sumber
Ada beberapa jawaban yang bagus di sini, dan sebelum saya memberikan milik saya, saya ingin menyoroti beberapa permata (tidak ada kata ruby yang dimaksudkan) yang saya baca di sini.
len
sebenarnya adalah objek. Ruby, di sisi lain, tidak memiliki fungsi kelas satu. Jadilen
objek fungsi memiliki metode sendiri yang dapat Anda periksa dengan menjalankandir(len)
.Jika Anda tidak suka cara ini bekerja dalam kode Anda sendiri, itu sepele bagi Anda untuk mengimplementasikan kembali wadah menggunakan metode yang Anda sukai (lihat contoh di bawah).
sumber
Bisa juga dikatakan
Menggunakan Python 2.7.3.
sumber
len
fungsi sudah disebutkan dalam jawaban sebelumnya. Apa gunanya "jawaban" ini?Sesuatu yang hilang dari sisa jawaban di sini:
len
fungsi memeriksa bahwa__len__
metode mengembalikan non-negatifint
. Fakta yanglen
merupakan fungsi berarti bahwa kelas tidak bisa mengesampingkan perilaku ini untuk menghindari pemeriksaan. Dengan demikian,len(obj)
memberikan tingkat keamanan yangobj.len()
tidak bisa.Contoh:
Tentu saja, dimungkinkan untuk "menimpa"
len
fungsi dengan menugaskannya kembali sebagai variabel global, tetapi kode yang melakukan ini jauh lebih mencurigakan daripada kode yang menimpa metode di kelas.sumber
Tidak?
sumber