Saya telah membaca sebagian besar dokumentasi __getitem__
di dalam dokumen Python, tetapi saya masih tidak dapat memahami artinya.
Jadi yang bisa saya mengerti adalah yang __getitem__
digunakan untuk mengimplementasikan panggilan seperti self[key]
. Tapi apa gunanya?
Katakanlah saya memiliki kelas python yang ditentukan dengan cara ini:
class Person:
def __init__(self,name,age):
self.name = name
self.age = age
def __getitem__(self,key):
print ("Inside `__getitem__` method!")
return getattr(self,key)
p = Person("Subhayan",32)
print (p["age"])
Ini mengembalikan hasil seperti yang diharapkan. Tapi mengapa digunakan __getitem__
di tempat pertama? Saya juga mendengar bahwa Python memanggil secara __getitem__
internal. Tapi mengapa melakukannya?
Bisakah seseorang menjelaskan ini lebih detail?
__getitem__
digunakan dalam contoh Anda tidak membuat banyak akal, tapi bayangkan bahwa Anda perlu untuk menulis daftar-kustom atau kamus-seperti kelas, yang harus bekerja dengan kode yang sudah ada yang menggunakan[]
. Itu adalah situasi__getitem__
yang berguna.Jawaban:
Cong Ma melakukan pekerjaan yang baik dalam menjelaskan apa
__getitem__
yang digunakan - tapi saya ingin memberi Anda contoh yang mungkin berguna. Bayangkan sebuah kelas yang memodelkan sebuah bangunan. Di dalam data untuk bangunan itu mencakup sejumlah atribut, termasuk deskripsi perusahaan yang menempati setiap lantai:Tanpa menggunakan
__getitem__
kita akan memiliki kelas seperti ini:Namun kami dapat menggunakan
__getitem__
(dan mitranya__setitem__
) untuk membuat penggunaan kelas Bangunan 'lebih bagus'.Apakah Anda menggunakan
__setitem__
seperti ini benar-benar tergantung pada bagaimana Anda berencana untuk mengabstraksi data Anda - dalam hal ini kami telah memutuskan untuk memperlakukan sebuah bangunan sebagai wadah lantai (dan Anda juga dapat menerapkan iterator untuk Bangunan tersebut, dan bahkan mungkin kemampuan untuk mengiris - yaitu mendapatkan lebih dari satu data lantai sekaligus - tergantung pada apa yang Anda butuhkan.sumber
building1[2]
panggilan itu sendiri secara internal memanggil getitem tersebut. Jadi poin yang dibuat @ tony-suffolk-66 adalah, setiap properti / variabel kelas dapat diambil selama run time hanya dengan memanggil nama objek [variablename]. Hanya mengklarifikasi ini karena awalnya tidak jelas bagi saya dan menulisnya di sini berharap itu membantu seseorang. Hapus jika berlebihan, silakanlen()
, dan Anda akan mendapatkanTypeError
:TypeError: object of type 'Building' has no len()
The
[]
sintaks untuk mendapatkan item dengan kunci atau indeks hanya gula sintaks.Saat Anda mengevaluasi
a[i]
panggilan Pythona.__getitem__(i)
(atautype(a).__getitem__(a, i)
, tetapi perbedaan ini adalah tentang model pewarisan dan tidak penting di sini). Meskipun kelas daria
mungkin tidak secara eksplisit mendefinisikan metode ini, itu biasanya diwarisi dari kelas leluhur.Semua nama metode khusus (Python 2.7) dan semantiknya tercantum di sini: https://docs.python.org/2.7/reference/datamodel.html#special-method-names
sumber
Metode ajaib
__getitem__
pada dasarnya digunakan untuk mengakses item daftar, entri kamus, elemen array, dll. Ini sangat berguna untuk pencarian cepat atribut contoh.Di sini saya menunjukkan ini dengan contoh class Person yang dapat dipakai oleh 'name', 'age', dan 'dob' (tanggal lahir). The
__getitem__
Metode ditulis dengan cara yang satu dapat mengakses contoh atribut diindeks, seperti pertama atau terakhir nama, hari, bulan atau tahun dob ini, dllMisalkan salah satu input pengguna adalah sebagai berikut:
Dengan bantuan
__getitem__
metode, pengguna dapat mengakses atribut yang diindeks. misalnya,sumber