Apakah ada cara untuk mengambil daftar atribut yang ada pada instance kelas?
class new_class():
def __init__(self, number):
self.multi = int(number) * 2
self.str = str(number)
a = new_class(2)
print(', '.join(a.SOMETHING))
Hasil yang diinginkan adalah "multi, str" akan menjadi output. Saya ingin ini melihat atribut saat ini dari berbagai bagian skrip.
python
class
python-3.x
MadSc13ntist
sumber
sumber
NewClass
. Anda dapat menentang harapan orang-orang jika Anda menggunakan konvensi penamaan sepertinew_class
.help()
fungsi membantu untuk mendapatkan info tentang kelas, fungsi, builtin, modul, dan lainnyaJawaban:
Anda juga dapat menemukan cetakan sangat membantu.
sumber
pprint.pprint(a.__dict__)
lakukan print cantik pada atribut.pprint
TIDAK bekerja pada Python 2.6.Kemudian Anda bisa menguji dengan tipe apa
type()
atau apakah metode dengancallable()
.sumber
boston
dataset dari sklearn -__dict__
kosong, padahal sebenarnya ada 5 atribut yang tersediavars(obj)
mengembalikan atribut suatu objek.sumber
Semua jawaban sebelumnya benar, Anda memiliki tiga opsi untuk apa yang Anda minta
dir()
vars()
__dict__
sumber
vars(foo)
kembalifoo.__dict__
Ini tentu saja akan mencetak metode atau atribut apa pun dalam definisi kelas. Anda dapat mengecualikan metode "pribadi" dengan mengubah
i.startwith('__')
kei.startwith('_')
sumber
The memeriksa modul menyediakan cara mudah untuk memeriksa suatu objek:
Dengan menggunakan
getmembers()
Anda dapat melihat semua atribut kelas Anda, beserta nilainya. Untuk mengecualikan atribut pribadi atau yang dilindungi gunakan.startswith('_')
. Untuk mengecualikan metode atau fungsi, gunakaninspect.ismethod()
atauinspect.isfunction()
.Catatan yang
ismethod()
digunakan pada elemen keduai
sejak yang pertama hanyalah string (namanya).Offtopic: Gunakan CamelCase untuk nama kelas.
sumber
Anda bisa menggunakan
dir(your_object)
untuk mendapatkan atribut dangetattr(your_object, your_object_attr)
untuk mendapatkan nilaipenggunaan:
Ini sangat berguna jika objek Anda tidak memiliki __dict__. Jika tidak, Anda dapat mencoba var (objek_Anda) juga
sumber
Sering disebutkan bahwa untuk membuat daftar atribut lengkap yang harus Anda gunakan
dir()
. Namun perlu dicatat bahwa bertentangan dengan kepercayaan populerdir()
tidak membawa semua atribut. Misalnya, Anda mungkin memperhatikan bahwa__name__
mungkin ada yang hilang dari daftar kelasdir()
meskipun Anda dapat mengaksesnya dari kelas itu sendiri. Dari dokumen padadir()
( Python 2 , Python 3 ):Fungsi seperti berikut cenderung lebih lengkap, meskipun tidak ada jaminan kelengkapan karena daftar yang dikembalikan oleh
dir()
dapat dipengaruhi oleh banyak faktor termasuk menerapkan__dir__()
metode, atau menyesuaikan__getattr__()
atau__getattribute__()
di kelas atau salah satu dari orang tuanya. Lihat tautan yang disediakan untuk detail lebih lanjut.sumber
Untuk apa Anda menginginkan ini? Mungkin sulit untuk memberi Anda jawaban terbaik tanpa mengetahui maksud pasti Anda.
Hampir selalu lebih baik untuk melakukan ini secara manual jika Anda ingin menampilkan instance kelas Anda dengan cara tertentu. Ini akan mencakup apa yang Anda inginkan dan tidak termasuk apa yang tidak Anda inginkan, dan urutannya dapat diprediksi.
Jika Anda mencari cara untuk menampilkan konten kelas, secara manual format atribut yang Anda pedulikan dan berikan ini sebagai
__str__
atau__repr__
metode untuk kelas Anda.Jika Anda ingin mempelajari tentang metode apa dan yang ada untuk objek untuk memahami cara kerjanya, gunakan
help
.help(a)
akan menampilkan output terformat tentang kelas objek berdasarkan dokumennya.dir
ada untuk mendapatkan semua atribut objek secara terprogram. (Mengakses__dict__
melakukan sesuatu yang saya kelompokkan sebagai sama tetapi saya tidak akan menggunakan diri saya sendiri.) Namun, ini mungkin tidak termasuk hal-hal yang Anda inginkan dan itu mungkin termasuk hal-hal yang tidak Anda inginkan. Itu tidak dapat diandalkan dan orang berpikir mereka menginginkannya lebih sering daripada yang mereka lakukan.Pada catatan yang agak ortogonal, ada sangat sedikit dukungan untuk Python 3 saat ini. Jika Anda tertarik untuk menulis perangkat lunak nyata Anda akan menginginkan hal-hal pihak ketiga seperti numpy, lxml, Twisted, PIL, atau sejumlah kerangka kerja web yang belum mendukung Python 3 dan tidak memiliki rencana terlalu cepat. Perbedaan antara 2.6 dan cabang 3.x kecil, tetapi perbedaan dalam dukungan perpustakaan sangat besar.
sumber
Ada lebih dari satu cara untuk melakukannya:
Saat dijalankan, kode ini menghasilkan:
sumber
Silakan lihat skrip shell python yang telah dieksekusi secara berurutan, di sini Anda akan mendapatkan atribut kelas dalam format string yang dipisahkan oleh koma.
Saya menggunakan python 3.4
sumber
a.__dict__.keys()
. Namun jika Anda ingin tahu apakah suatu objek memiliki atribut tertentu yang dapat Anda gunakanhasattr
.Selain jawaban ini, saya akan menyertakan fungsi (python 3) untuk memuntahkan hampir seluruh struktur nilai apa pun. Ini digunakan
dir
untuk membuat daftar lengkap nama properti, lalu gunakangetattr
dengan masing-masing nama. Ini menampilkan jenis setiap anggota dari nilai, dan bila mungkin juga menampilkan seluruh anggota:Sekarang, salah satu dari yang berikut ini harus memberi wawasan:
sumber
Dapatkan atribut dari suatu objek
Keluaran
sumber
Seperti yang ditulis sebelum menggunakan
obj.__dict__
dapat menangani kasus umum tetapi beberapa kelas tidak memiliki__dict__
atribut dan penggunaan__slots__
(kebanyakan untuk efisiensi memori).contoh untuk cara yang lebih tangguh dalam melakukan ini:
output kode ini:
Catatan1:
Python adalah bahasa yang dinamis dan selalu lebih baik mengetahui kelas yang Anda coba dapatkan atributnya karena bahkan kode ini dapat melewatkan beberapa kasus.
Note2:
kode ini hanya menghasilkan variabel instan yang berarti variabel kelas tidak disediakan. sebagai contoh:
output kode:
Kode ini tidak mencetak
url
atribut class dan mungkin menghilangkan atribut class yang diinginkan.Terkadang kita mungkin berpikir bahwa atribut adalah anggota instan tetapi tidak dan tidak akan ditampilkan menggunakan contoh ini.
sumber
__dict__
dan__slots__
, jadi Anda mungkin ingin mencoba keduanya bukan hanya dict.__dict__
atauvars
tidak berfungsi karena ketinggalan__slots__
.__dict__
dan__slots__
tidak berfungsi karena ketinggalan__slots__
dari kelas dasar.dir
tidak berfungsi karena termasuk atribut kelas, seperti metode atau properti, serta atribut objek.vars
sama dengan menggunakan__dict__
.Ini yang terbaik yang saya miliki:
sumber
sumber
Silakan lihat eksekusi scripting shell Python berikut secara berurutan, itu akan memberikan solusi dari penciptaan kelas untuk mengekstraksi nama field instance.
sumber
__attr__
memberikan daftar atribut instance.sumber
__attr__
deskripsi tetapi menggunakan__attrs__
kode. Tidak ada yang bekerja untuk saya (werkzeug.datastructures.FileStorage)