Python

Tutorial Deskriptor Python

Tutorial Deskriptor Python
Teknik yang berguna untuk menulis kode generik yang dapat digunakan kembali antar kelas didukung oleh deskriptor Python, atau lebih dikenal sebagai deskriptor. Mereka mungkin terdengar dekat dengan gagasan tentang warisan, tetapi sebenarnya tidak. Ini adalah teknik langsung untuk menangkap akses ke atribut dengan sifat mengikat. Deskriptor adalah fungsi dasar Python yang mengatur banyak sihir, tersembunyi di bawah penutup bahasa. Jika Anda pernah merasa bahwa deskriptor Python dengan sedikit implementasi fungsional adalah subjek tingkat lanjut, maka tutorial ini adalah platform utama untuk membuat Anda memahami fitur canggih ini.

Metode Deskriptor

Untuk menyatakannya dengan jelas, kelas yang mengimplementasikan __Dapatkan_(), __set()_, atau __menghapus()_ fungsi protokol deskriptor untuk suatu objek diklasifikasikan sebagai "Descriptor". Untuk mengatur parameter berbagai kelas yang menggunakan objek sebagai referensi, deskriptor Python dibuat Python. Berikut adalah tiga metode yang ditentukan, yang akan digunakan dalam deskriptor:

__Dapatkan__(): Saat Anda mencoba mengekstrak data, __Dapatkan__() atribut dipanggil, dan apa pun yang diberikannya adalah apa yang akan diberikan ke kode yang menuntut nilai satu variabel. Ini dikategorikan sebagai deskriptor non-data dan hanya dapat dibaca.

__set__(): fungsi __set__() dipanggil untuk menyesuaikan nilai parameter, dan tidak ada yang dikembalikan kepada Anda oleh fungsi ini. Ini dikenal sebagai deskriptor data yang tidak hanya dapat dibaca tetapi juga dapat ditulis.

__menghapus__(): Setiap kali parameter dihapus dari suatu objek, __menghapus__() fungsi disebut. Ini dikenal sebagai deskriptor data yang tidak hanya dapat dibaca tetapi juga dapat ditulis.

Anda hanya perlu menerapkan protokol deskriptor jika Anda menggunakan deskriptor Python dalam skrip Anda. Fungsi paling signifikan dari protokol adalah Dapatkan() dan set() memiliki tanda tangan berikutnya.

__get__(self, obj, type=None) -> objek
__set__(diri, obj, nilai) -> Tidak ada

diri adalah contoh dari deskriptor.
obj adalah turunan dari objek yang terhubung dengan deskriptor Anda.
Tipe adalah jenis benda.

Contoh:

Di sini kita telah mendefinisikan dua kelas. Di kelas Descriptor, kami telah mendefinisikan metode deskriptor. Dalam Dapatkan() metode, self adalah instance untuk deskriptor 'val', itu akan mendapatkan nilai 'Geeks' dan menyimpannya. Maka itu akan membuat string dengan 'untuk' dilampirkan di antara atribut yang disediakan. kelas Descriptor (objek):

def __get__(self, obj, objtype):
kembalikan “untuk”.format (diri sendiri).val, diri sendiri.val)

Kemudian akan mengembalikan nilai ke metode set()(). Fungsi ini kemudian memeriksa nilainya, apakah itu string atau bukan. Jika nilainya adalah string, itu akan disimpan ke dalam atribut bernama 'val'. Jika nilainya bukan string, itu akan mengeluarkan pengecualian.

def __set__(sendiri, obj, val):
if isinstance(val, str):
diri.val = val
lain:
menaikkan TypeError("Nama harus string")

Setelah itu, nilainya akan dicetak sebagai string 'GeeksforGeeks'.

kelas GFG (objek):
val = Deskriptor()
g = GFG()
g.val = “Geeks”
cetak (g.val)

Ketika Anda mencoba menjalankan kode ini, Anda akan mendapatkan output berikut:

GeeksforGeeks

Tujuan Deskriptor

Mari kita gambarkan sebuah kelas bernama 'rumah' dengan tiga karakteristik, yaitu: lokasi, area, dan harga. Anda dapat menggunakan fungsi __init__() untuk menginisialisasi atribut kelas.

rumah kelas:

def __init__(self,loc,area,price):

Kemudian, Anda dapat menggunakan fungsi __str__(), yang dapat mengembalikan hasil dari tiga atribut yang mungkin Anda berikan ke kelas saat membuat item. Fungsi __str__() akan mengembalikan string.

Ketika Anda menjalankan kode ini, itu akan menampilkan output yang tampaknya benar.

Sekarang mari kita coba ubah harga rumah ke nilai negatif, seperti di bawah ini, dan jalankan kodenya.

Tidak ada perubahan sama sekali, kecuali tanda negatif, seperti yang ditunjukkan pada output. Tunggu sebentar! Ada yang tidak beres di sini, bukan?? Kok harga rumah negatif. Python mengizinkannya karena Python adalah lingkungan pengembangan serbaguna yang secara khusus tidak mengizinkan pengecekan tipe.

Mari kita inisialisasi pernyataan 'jika' di __init__() berfungsi untuk menaikkan pengecualian jika nilai atau harga kurang dari nol.

Sampai sekarang, Anda mungkin memperhatikan bahwa itu berkinerja baik, dan jika harganya kurang dari nol, kode menghasilkan Kesalahan Nilai.

Seperti yang mungkin kita pahami, __init_() function adalah konstruktor, dan hanya dipanggil sekali ketika Anda membuat objek kelas. Oleh karena itu, nanti, pemeriksaan tipe yang disesuaikan akan gagal. Python menyediakan Deskriptor yang berspesialisasi dalam membantu memperbaiki semua masalah di atas. Sekarang, mari kita mulai menggunakan deskriptor dalam contoh yang sama untuk memahaminya dengan baik.

kelas deskriptor' __init_() fungsi memiliki variabel lokal __price pada 0. Pada awalnya, garis bawah ganda menyiratkan bahwa parameternya bersifat pribadi. Ini digunakan untuk membedakan parameter harga kelas Deskriptor dari kelas asal.

Itu __Dapatkan__() metode akan mengembalikan harga. Instance atribut berisi h1, yang merupakan instance deskriptor. Pemilik atribut mengacu pada nama kelas 'rumah' dan mengembalikan harganya.

Fungsinya __set__() memiliki atribut contoh yang berisi h1, dan nilai yang akan ditetapkan. Cek digunakan untuk mengkonfirmasi nilai. Jika nilainya bilangan bulat, itu akan dicetak, jika tidak, kode dengan pengecualian Kesalahan Jenis Type. Jika nilainya di bawah nol, pengecualian Nilai Kesalahan akan dilemparkan ke dalam kode.

Itu __menghapus__() fungsi dijalankan ketika atribut parameter dihapus dari suatu objek.

Kelas rumah tetap sama, meskipun instance harga dari kelas Descriptor() ditambahkan. Dalam __init_() fungsi, tambahkan atribut harga ke harga instan, dan itu akan memanggil call __set_() fungsi.

Saat menjalankan kode ini, itu akan memberi Anda Kesalahan Nilai karena harganya tidak akan pernah nol.

Sekarang coba jalankan kode dengan nilai string.

Ini akan melempar pengecualian Type Error.

Nilai instance yang ada diganti pada pembentukan instance baru karena deskriptor terkait dengan kelas dan bukan instance. Lihatlah di bawah ini:

Nilai pertama telah diganti dengan yang kedua.

Kesimpulan

Kami dapat memahami mengapa deskriptor dari Python menjadi topik yang menarik dan skenario penggunaan seperti apa yang dapat Anda tambahkan dengan melalui tutorial ini.

Cara Menggunakan Xdotool untuk Merangsang Klik Mouse dan Keystroke di Linux
Xdotool adalah alat baris perintah sumber terbuka dan gratis untuk mensimulasikan klik mouse dan penekanan tombol. Artikel ini akan membahas panduan s...
5 Produk Mouse Komputer Ergonomis Terbaik untuk Linux
Apakah penggunaan komputer yang lama menyebabkan rasa sakit di pergelangan tangan atau jari Anda?? Apakah Anda menderita persendian yang kaku dan teru...
Cara Mengubah Pengaturan Mouse dan Touchpad Menggunakan Xinput di Linux
Sebagian besar distribusi Linux dikirimkan dengan pustaka "libinput" secara default untuk menangani kejadian input pada sistem. Ini dapat memproses ke...