Apakah ada metode built-in dengan Python untuk mendapatkan array dari semua variabel instance kelas? Misalnya, jika saya memiliki kode ini:
class hi:
def __init__(self):
self.ii = "foo"
self.kk = "bar"
Apakah ada cara bagi saya untuk melakukan ini:
>>> mystery_method(hi)
["ii", "kk"]
Sunting: Saya awalnya telah meminta variabel kelas secara keliru.
python
methods
instance-variables
Chris Bunch
sumber
sumber
Jawaban:
Setiap objek memiliki
__dict__
variabel yang berisi semua variabel dan nilainya di dalamnya.Coba ini
sumber
Gunakan vars ()
sumber
__method
bersifat pribadi,__method__
merupakan metode khusus, tidak harus pribadi; Saya ingin mengatakan metode khusus mendefinisikan kemampuan objek daripada metode.__method__
cukup jelek, dan saya pikir mereka dinamai seperti itu untuk mencoba dan menghalangi orang dari menggunakannya kecuali benar-benar diperlukan. Dalam hal ini kami memiliki alternatif vars ().__str__
,__method__
untuk bahasa itu sendiri biasanya. Apa yang terjadi saat Andastr(something)
?Anda biasanya tidak bisa mendapatkan atribut instance yang diberikan hanya sebuah kelas, setidaknya tidak tanpa membuat instance kelas tersebut. Anda bisa mendapatkan atribut instance jika diberi instance, atau atribut kelas yang diberikan kelas. Lihat modul 'inspect'. Anda tidak bisa mendapatkan daftar atribut instance karena instance benar-benar dapat memiliki apa saja sebagai atribut, dan - seperti dalam contoh Anda - cara normal untuk membuatnya adalah dengan menetapkannya di metode __init__.
Pengecualiannya adalah jika kelas Anda menggunakan slot, yang merupakan daftar tetap atribut yang diizinkan oleh kelas untuk dimiliki oleh instance. Slot dijelaskan di http://www.python.org/2.2.3/descrintro.html , tetapi ada berbagai kendala dengan slot; mereka mempengaruhi tata letak memori, sehingga beberapa warisan mungkin bermasalah, dan warisan secara umum harus memperhitungkan slot juga.
sumber
Metode Vars () dan dict akan bekerja untuk contoh yang diposting OP, tetapi metode tersebut tidak akan berfungsi untuk objek yang didefinisikan "secara longgar" seperti:
Untuk mencetak semua atribut non-callable, Anda dapat menggunakan fungsi berikut:
sumber
exec('print object.%s\n\n') % i
harus ditulis sebagaiprint getattr(object, i)
Anda juga dapat menguji apakah suatu objek memiliki variabel tertentu dengan:
sumber
Contoh Anda menunjukkan "variabel instan", bukan variabel kelas yang sebenarnya.
Cari
hi_obj.__class__.__dict__.items()
variabel kelas, bersama dengan anggota kelas lainnya seperti fungsi anggota dan modul yang memuatnya.Variabel kelas dibagikan oleh semua instance kelas.
sumber
Menyarankan
Dengan kata lain, ini pada dasarnya hanya membungkus __dict__
sumber
Meskipun bukan merupakan jawaban langsung untuk pertanyaan OP, ada cara yang cukup bagus untuk mengetahui variabel apa saja yang ada dalam lingkup suatu fungsi. lihat kode ini:
Atribut func_code memiliki semua jenis hal menarik di dalamnya. Ini memungkinkan Anda melakukan beberapa hal keren. Berikut adalah contoh bagaimana saya telah menggunakan ini:
sumber
dibangun di atas jawaban dmark untuk mendapatkan yang berikut, yang berguna jika Anda menginginkan persamaan sprintf dan semoga akan membantu seseorang ...
sumber
Terkadang Anda ingin memfilter daftar berdasarkan vars publik / pribadi. Misalnya
sumber