Saya ingin mendapatkan atribut kelas, katakanlah:
class MyClass():
a = "12"
b = "34"
def myfunc(self):
return self.a
menggunakan MyClass.__dict__
memberi saya daftar atribut dan fungsi, dan bahkan fungsi seperti __module__
dan __doc__
. While MyClass().__dict__
memberi saya dict kosong kecuali saya secara eksplisit menetapkan nilai atribut dari instance itu.
Saya hanya ingin atributnya, dalam contoh di atas itu adalah: a
danb
python
python-2.7
class
attributes
Mohamed Khamis
sumber
sumber
Jawaban:
Coba modul inspeksi .
getmembers
dan berbagai tes akan membantu.EDIT:
Sebagai contoh,
Sekarang, metode dan atribut khusus membuat saya jengkel - itu dapat ditangani dengan beberapa cara, yang paling mudah adalah hanya dengan memfilter berdasarkan nama.
... dan yang lebih rumit dapat menyertakan pemeriksaan nama atribut khusus atau bahkan metaclass;)
sumber
attributes = inspect.getmembers(MyClass, lambda a:not(inspect.isroutine(a)))
print [a[0] for a in attributes if '_' not in a[0]]
like_this
! Ini juga akan menghindari atribut "pribadi", yang mungkin Anda lakukan dengan sengaja.inspect.getmembers(MyClass, ...
,MyClass
dapat diganti dengan kelas atau objek, dan jika Anda memerlukan daftar nilai objek Anda, Anda harus menggantiMyClass
dengan variabel objek Anda (atauself
jika Anda meletakkan ekspresi ini dalamdef __repr__()
metode seperti saya).i = inspect.getmembers(MyClass, lambda a:not(inspect.isroutine(a))); z = [_[1] for _ in i if _[0] in '__dict__'][0]
dan kemudian ini hanya masalah mendapatkan kunci dari z.sumber
if not i.startswith('_')
bukanif i[:1] != '_'
?.__dict__.keys()
tidak akan menyertakan atribut dari orang tua.myfunc
adalah atribut dariMyClass
. Begitulah cara ditemukan saat Anda menjalankan:Itu mencari atribut pada
myinstance
bernamamyfunc
, tidak menemukannya, melihat itumyinstance
adalah turunan dariMyClass
dan mencarinya di sana.Jadi daftar lengkap atributnya
MyClass
adalah:(Perhatikan bahwa saya menggunakan dir hanya sebagai cara cepat dan mudah untuk membuat daftar anggota kelas: itu hanya boleh digunakan dalam cara eksplorasi, bukan dalam kode produksi)
Jika Anda hanya ingin atribut tertentu, Anda akan perlu untuk menyaring daftar ini menggunakan beberapa kriteria, karena
__doc__
,__module__
danmyfunc
tidak khusus dengan cara apapun, mereka atribut berada di persis dengan cara yang sama yanga
danb
yang.Saya tidak pernah menggunakan modul inspeksi yang dirujuk oleh Matt dan Borealid, tetapi dari tautan singkat sepertinya ada tes untuk membantu Anda melakukan ini, tetapi Anda harus menulis fungsi predikat Anda sendiri, karena sepertinya itu yang Anda inginkan kira-kira adalah atribut yang tidak lulus
isroutine
ujian dan tidak dimulai dan diakhiri dengan dua garis bawah.Juga perhatikan: dengan menggunakan
class MyClass():
Python 2.7 Anda menggunakan kelas gaya lama yang sangat ketinggalan zaman. Kecuali Anda melakukannya dengan sengaja untuk kompatibilitas dengan pustaka yang sangat lama, Anda harus mendefinisikan kelas Anda sebagaiclass MyClass(object):
. Di Python 3 tidak ada kelas "gaya lama", dan perilaku ini adalah default. Namun, menggunakan kelas gaya baru akan memberi Anda lebih banyak atribut yang ditentukan secara otomatis:sumber
dir()
: " Karena dir () disediakan terutama sebagai kemudahan untuk digunakan pada prompt interaktif, ia mencoba untuk menyediakan satu set nama yang menarik lebih dari itu mencoba untuk menyediakan satu set nama yang didefinisikan secara ketat atau konsisten , dan detailnya perilaku dapat berubah di seluruh rilis . "(lihat dokumentasidir()
).Mendapatkan hanya atribut instance itu mudah.
Tetapi mendapatkan juga atribut kelas tanpa fungsi sedikit lebih rumit.
Atribut instance saja
Jika Anda hanya perlu membuat daftar atribut contoh, gunakan saja
for attribute, value in my_instance
.__dict__
.items()
Instance dan atribut kelas
Untuk mendapatkan juga atribut kelas tanpa fungsi, triknya adalah dengan menggunakan
callable()
.Tapi metode statis yang tidak selalu
callable
!Oleh karena itu, daripada menggunakan
callable(value)
usecallable
(getattr
(MyClass, attribute))
Contoh
Catatan:
print_class_attributes()
harus tetapi tidak dalam hal bodoh dan sederhana ini@staticmethod
contoh .
Hasil untuk python2
Hasil yang sama untuk python3
sumber
MyClass().__class__.__dict__
Namun, "hak" untuk melakukan ini adalah melalui modul inspeksi .
sumber
MyClass().__class__.__dict__
==MyClass.__dict__
MyClass().__class__.__dict__ != MyClass().__dict__
, tetapi yak tidak termasuk tanda kurung di sisi kanan, dalam hal mana dia benarUntuk instance MyClass, seperti
gunakan
type(mc)
sebagai penggantiMyClass
dalam pemahaman daftar. Namun, jika seseorang secara dinamis menambahkan atribut kemc
, sepertimc.c = "42"
, atribut tersebut tidak akan muncul saat digunakantype(mc)
dalam strategi ini. Ini hanya memberikan atribut kelas aslinya.Untuk mendapatkan kamus lengkap untuk instance kelas, Anda perlu MENGGABUNGKAN kamus dari
type(mc).__dict__
danmc.__dict__
.sumber
Saya tidak tahu apakah sesuatu yang serupa telah dibuat sekarang atau belum, tetapi saya membuat fungsi pencarian atribut yang bagus menggunakan vars (). vars () membuat kamus atribut kelas yang Anda lewati.
Saya mengembangkan Petualangan Teks yang cukup besar dengan Python, kelas Pemain saya sejauh ini memiliki lebih dari 100 atribut. Saya menggunakan ini untuk mencari atribut tertentu yang perlu saya lihat.
sumber
Ini bisa dilakukan tanpa pemeriksaan, kurasa.
Ikuti kelas berikut:
Melihat anggota beserta tipenya:
... memberikan:
Jadi untuk menghasilkan hanya variabel, Anda hanya perlu memfilter hasil berdasarkan jenis, dan nama tidak dimulai dengan '__'. Misalnya
Itu dia.
Catatan: jika Anda menggunakan Python 3, konversikan iterator menjadi daftar.
Jika Anda menginginkan cara yang lebih efektif untuk melakukannya, gunakan inspect .
sumber
Python 2 & 3, menghapus impor, memfilter objek berdasarkan alamatnya
Solusi singkatnya:
Kembalikan dikt {attribute_name: atribut_value} , objek difilter. yaitu
{'a': 1, 'b': (2, 2), 'c': [3, 3]}
Kembali daftar [nama_tribut] , objek difilter. yaitu
['a', 'b', 'c', 'd']
Kembalikan daftar [nilai_atribut] , objek yang difilter. yaitu
[1, (2, 2), [3, 3], {4: 4}]
Tidak memfilter objek
Menghapus
if
kondisi tersebut. Kembali{'a': 1, 'c': [3, 3], 'b': (2, 2), 'e': <function <lambda> at 0x7fc8a870fd70>, 'd': {4: 4}, 'f': <object object at 0x7fc8abe130e0>}
Solusi lama
Selama implementasi default
__repr__
tidak ditimpa ,if
pernyataan akan dikembalikanTrue
jika representasi heksadesimal dari lokasi dalam memorival
ada dalam__repr__
string kembali.Mengenai implementasi default
__repr__
Anda dapat menemukan berguna jawaban ini . Pendeknya:Yang mengembalikan string seperti:
Lokasi dalam memori setiap elemen didapat melalui
id()
metode.Python Docs mengatakan tentang id ():
Coba sendiri
Keluaran:
Catatan :
Diuji dengan Python
2.7.13
dan Python3.5.3
Dalam Python 2.x
.iteritems()
lebih disukai daripada.items()
sumber
Saya baru-baru ini perlu mencari tahu sesuatu yang mirip dengan pertanyaan ini, jadi saya ingin memposting beberapa info latar belakang yang mungkin berguna bagi orang lain yang menghadapi hal yang sama di masa mendatang.
Berikut cara kerjanya dengan Python (dari https://docs.python.org/3.5/reference/datamodel.html#the-standard-type-hierarchy ):
MyClass
adalah objek kelas,MyClass()
adalah turunan dari objek kelas. Sebuah instance__dict__
hanya memiliki atribut dan metode khusus untuk instance itu (misalnyaself.somethings
). Jika atribut atau metode adalah bagian dari kelas, itu ada di kelas__dict__
. Ketika Anda melakukannyaMyClass().__dict__
, sebuah instanceMyClass
dibuat tanpa atribut atau metode selain atribut kelas, sehingga kosong__dict__
Jadi jika Anda berkata
print(MyClass().b)
, Python pertama-tama memeriksa dikt instance baruMyClass().__dict__['b']
dan gagal menemukannyab
. Ia kemudian memeriksa kelasMyClass.__dict__['b']
dan menemukanb
.Itulah mengapa Anda membutuhkan
inspect
modul, untuk meniru proses pencarian yang sama.sumber
Anda dapat menggunakan
dir()
pemahaman daftar untuk mendapatkan nama atribut:Gunakan
getattr()
untuk mendapatkan atributnya sendiri:sumber
Solusi saya untuk mendapatkan semua atribut (bukan metode) dari kelas (jika kelas memiliki docstring yang ditulis dengan benar yang memiliki atribut yang dieja dengan jelas):
Bagian ini
cls.__dict__['__doc__']
mengekstrak docstring dari kelas.sumber
Mengapa Anda perlu membuat daftar atribut? Tampaknya kelas Anda secara semantik adalah sebuah koleksi. Dalam kasus ini saya merekomendasikan untuk menggunakan enum:
Sebutkan atribut Anda? Tidak ada yang lebih mudah dari ini:
sumber
Jika Anda ingin "mendapatkan" atribut, ada jawaban yang sangat sederhana , yang seharusnya sudah jelas: getattr
Ia bekerja bagus baik di Python 2.7 dan Python 3.x.
Jika Anda menginginkan daftar item ini, Anda masih perlu menggunakan inspect.
sumber
dua fungsi:
menggunakan:
sumber
Berikut ini yang saya inginkan.
Uji Data
sumber
Saya tahu ini terjadi tiga tahun lalu, tetapi bagi mereka yang memiliki pertanyaan ini di masa depan, bagi saya:
bekerja dengan baik.
sumber
attribute
itu sebelumnya.Anda bisa menggunakan
MyClass.__attrs__
. Itu hanya memberikan semua atribut kelas itu. Tidak ada lagi.sumber