Saya baru saja membaca tentang getattr()
fungsinya . Masalahnya adalah saya masih belum bisa memahami ide penggunaannya. Satu-satunya hal yang saya mengerti tentang getattr()
adalah bahwa getattr(li, "pop")
adalah sama dengan menelepon li.pop
.
Saya tidak mengerti ketika buku itu menyebutkan bagaimana Anda menggunakannya untuk mendapatkan referensi ke suatu fungsi tanpa mengetahui namanya sampai waktu berjalan. Mungkin ini adalah saya menjadi noob dalam pemrograman, secara umum. Adakah yang bisa menjelaskan masalah ini? Kapan dan bagaimana tepatnya saya menggunakan ini?
Jawaban:
getattr(object, 'x')
sepenuhnya sama denganobject.x
.Hanya ada dua kasus di mana
getattr
dapat bermanfaat.object.x
, karena sebelumnya Anda tidak tahu atribut mana yang Anda inginkan (itu berasal dari string). Sangat berguna untuk meta-programming.object.y
akan menaikkanAttributeError
jika tidak aday
. Tetapigetattr(object, 'y', 5)
akan kembali5
.sumber
Objek dalam Python dapat memiliki atribut - atribut data dan fungsi untuk bekerja dengan mereka (metode). Sebenarnya, setiap objek memiliki atribut bawaan.
Misalnya Anda memiliki objek
person
, yang memiliki beberapa atribut:name
,gender
, dllAnda mengakses atribut ini (baik itu metode atau objek data) biasanya menulis:
person.name
,person.gender
,person.the_method()
, dllTetapi bagaimana jika Anda tidak tahu nama atribut pada saat Anda menulis program? Misalnya Anda memiliki nama atribut yang disimpan dalam variabel yang disebut
attr_name
.jika
lalu, alih-alih menulis
kamu bisa menulis
Beberapa latihan:
getattr
akan naikAttributeError
jika atribut dengan nama yang diberikan tidak ada di objek:Tapi Anda bisa memberikan nilai default sebagai argumen ketiga, yang akan dikembalikan jika atribut seperti itu tidak ada:
Anda dapat menggunakannya
getattr
bersamaandir
untuk mengulangi semua nama atribut dan mendapatkan nilainya:Penggunaan praktis untuk ini adalah untuk menemukan semua metode yang namanya dimulai dengan
test
dan memanggil mereka .Mirip dengan
getattr
adasetattr
yang memungkinkan Anda untuk menetapkan atribut objek yang namanya:sumber
getattr(..)
harus digunakan dalam 2 skenario: 1. ketika nama atribut adalah nilai di dalam variabel (misalnyagetattr(person, some_attr)
) dan 2. ketika kita perlu menggunakan argumen posisi ketiga untuk nilai default (misalnyagetattr(person, 'age', 24)
). Jika saya melihat skenario sepertigetattr(person, 'age')
itu bagi saya itu identik denganperson.age
yang membuat saya berpikir bahwaperson.age
itu lebih Pythonic. Apakah itu benar?Bagi saya,
getattr
paling mudah menjelaskannya dengan cara ini:Ini memungkinkan Anda untuk memanggil metode berdasarkan pada isi string dan bukannya mengetikkan nama metode.
Misalnya, Anda tidak dapat melakukan ini:
karena x bukan tipe
builtin
, tetapistr
. Namun, Anda BISA melakukan ini:Ini memungkinkan Anda untuk terhubung secara dinamis dengan objek berdasarkan input Anda. Saya merasa berguna ketika berhadapan dengan objek dan modul khusus.
sumber
Kasus penggunaan yang cukup umum
getattr
adalah memetakan data ke fungsi.Misalnya, dalam kerangka kerja web seperti Django atau Pylons,
getattr
membuatnya mudah untuk memetakan URL permintaan web ke fungsi yang akan menanganinya. Jika Anda melihat di bawah kap perutean Pylons, misalnya, Anda akan melihat bahwa (secara default, setidaknya) itu memotong URL permintaan, seperti:ke dalam "pelanggan" dan "daftar". Kemudian mencari kelas controller bernama
CustomerController
. Dengan asumsi ia menemukan kelas, ia membuat turunan kelas dan kemudian menggunakangetattr
untuk mendapatkanlist
metodenya. Kemudian memanggil metode itu, meneruskannya permintaan sebagai argumen.Setelah Anda memahami ide ini, menjadi sangat mudah untuk memperluas fungsionalitas aplikasi web: cukup tambahkan metode baru ke kelas controller, dan kemudian buat tautan di halaman Anda yang menggunakan URL yang sesuai untuk metode tersebut. Semua ini dimungkinkan oleh
getattr
.sumber
Berikut adalah contoh cepat dan kotor tentang bagaimana suatu kelas dapat mem-boot versi berbeda dari metode penyimpanan tergantung pada sistem operasi mana yang sedang dieksekusi saat menggunakan
getattr()
.Sekarang mari kita gunakan kelas ini dalam contoh:
sumber
Selain semua jawaban luar biasa di sini, ada cara yang digunakan
getattr
untuk menyimpan baris kode yang berlebihan dan menjaganya tetap nyaman. Pikiran ini muncul setelah representasi kode yang mengerikan yang terkadang menjadi keharusan.Skenario
Misalkan struktur direktori Anda adalah sebagai berikut:
Dan, Anda memiliki fungsi untuk mendapatkan informasi tentang
Thor
,Iron Man
,Doctor Strange
disuperheroes.py
. Anda dengan cerdas menuliskan properti mereka semuaproperties.py
dalam sebuah compactdict
dan kemudian mengaksesnya.properties.py
Sekarang, katakanlah Anda ingin mengembalikan kemampuan masing-masing sesuai permintaan
superheroes.py
. Jadi, ada fungsi seperti... dan lebih banyak fungsi yang mengembalikan nilai berbeda berdasarkan tombol dan pahlawan super.
Dengan bantuan
getattr
, Anda dapat melakukan sesuatu seperti:Anda sangat mengurangi jumlah baris kode, fungsi, dan pengulangan!
Oh dan tentu saja, jika Anda memiliki nama buruk seperti
properties_of_thor
untuk variabel, mereka dapat dibuat dan diakses hanya dengan melakukanCATATAN: Untuk masalah khusus ini, mungkin ada cara yang lebih cerdas untuk menghadapi situasi ini, tetapi idenya adalah untuk memberikan wawasan tentang penggunaan
getattr
di tempat yang tepat untuk menulis kode yang lebih bersih.sumber
sumber
Kadang-kadang saya gunakan
getattr(..)
untuk malas menginisialisasi atribut yang tidak penting sebelum mereka digunakan dalam kode.Bandingkan yang berikut ini:
Untuk ini:
Keuntungan dari cara kedua adalah bahwa
n_calls_to_plot
hanya muncul di sekitar tempat dalam kode di mana ia digunakan. Ini bagus untuk keterbacaan, karena (1) Anda dapat segera melihat nilai apa yang dimulai ketika membaca bagaimana itu digunakan, (2) itu tidak memperkenalkan gangguan ke dalam__init__(..)
metode, yang idealnya harus tentang keadaan konseptual kelas. , daripada beberapa penghitung utilitas yang hanya digunakan oleh salah satu metode fungsi karena alasan teknis, seperti optimasi, dan tidak ada hubungannya dengan makna objek.sumber
Cukup sering ketika saya membuat file XML dari data yang disimpan di kelas saya sering menerima kesalahan jika atribut tidak ada atau bertipe
None
. Dalam hal ini, masalah saya tidak tidak tahu apa nama atribut itu, seperti yang dinyatakan dalam pertanyaan Anda, melainkan apakah data pernah disimpan dalam atribut itu.Jika saya terbiasa
hasattr
melakukan ini, itu akan kembaliTrue
bahkan jika nilai atribut adalah tipeNone
dan ini akan menyebabkanset
perintah ElementTree saya gagal.Jika nilai atribut adalah tipe
None
,getattr
juga akan mengembalikannya yang akan menyebabkanset
perintah ElementTree saya gagal.Saya menggunakan metode berikut untuk menangani kasus-kasus ini sekarang:
Inilah saatnya dan bagaimana saya menggunakan
getattr
.sumber
Penggunaan lain dari getattr () dalam mengimplementasikan pernyataan switch dengan Python. Ini menggunakan kedua refleksi untuk mendapatkan jenis case.
sumber
setattr ()
Kami menggunakan setattr untuk menambahkan atribut ke instance kelas kami. Kami melewati instance kelas, nama atribut, dan nilai.
getattr ()
Dengan getattr kami mengembalikan nilai-nilai ini
Sebagai contoh
sumber
Saya pikir contoh ini cukup jelas. Itu menjalankan metode parameter pertama, yang namanya diberikan dalam parameter kedua.
sumber
Ini juga mengklarifikasi dari https://www.programiz.com/python-programming/methods/built-in/getattr
Usia adalah: 23
Usia adalah: 23
Jenis kelaminnya adalah: Pria
AttributeError: Objek 'Orang' tidak memiliki atribut 'seks'
sumber
Saya sudah mencoba di Python2.7.17
Beberapa rekan sudah menjawab. Namun saya telah mencoba memanggil getattr (obj, 'set_value') dan ini tidak mengeksekusi metode set_value, Jadi saya berubah menjadi getattr (obj, 'set_value') () -> Ini membantu untuk memanggil yang sama.
Kode Contoh:
Contoh 1:
sumber