Iterate atas atribut objek di python
Aku punya python objek dengan beberapa atribut dan metode. Saya ingin iterate atas atribut objek.
class my_python_obj(object):
attr1='a'
attr2='b'
attr3='c'
def method1(self, etc, etc):
#Statements
Saya ingin menghasilkan sebuah kamus yang berisi semua benda-benda atribut dan nilai saat ini, tapi saya ingin melakukannya dalam cara yang dinamis (jadi jika nanti saya tambahkan atribut lain saya don't harus ingat untuk memperbarui fungsi saya juga).
Dalam php variabel-variabel yang dapat digunakan sebagai tombol, tapi benda-benda di python adalah unsuscriptable dan jika saya menggunakan notasi titik untuk menciptakan atribut baru dengan nama saya var, yang tidak saya maksud.
Hanya untuk membuat hal-hal yang lebih jelas:
def to_dict(self):
'''this is what I already have'''
d={}
d["attr1"]= self.attr1
d["attr2"]= self.attr2
d["attr3"]= self.attr3
return d
·
def to_dict(self):
'''this is what I want to do'''
d={}
for v in my_python_obj.attributes:
d[v] = self.v
return d
Update: Dengan atribut maksudku hanya variabel-variabel dari objek ini, bukan metode.
135
8
Dengan asumsi anda memiliki kelas seperti
panggilan
dir
pada objek memberikan kembali semua atribut objek tersebut, termasuk python atribut khusus. Meskipun beberapa atribut objek adalah callable, seperti metode.Anda selalu dapat menyaring metode khusus dengan menggunakan daftar pemahaman.
atau jika anda lebih memilih peta/filter.
Jika anda ingin menyaring metode, anda dapat menggunakan built-in
callable
sebagai cek.Anda juga bisa memeriksa perbedaan antara class dan instance objek menggunakan.
secara umum menempatkan
__iter__
metode dalam kelas dan iterate melalui atribut objek atau menempatkan ini mixin kelas di kelas anda.Kelas anda:
Benda-benda di python toko atribut mereka (termasuk fungsi) dalam dict disebut
__dict__
. Anda dapat (tetapi umumnya tidak't) gunakan ini untuk mengakses atribut ini secara langsung. Jika anda hanya ingin daftar, anda bisa juga memanggildir(obj)
, yang kembali iterable dengan semua atribut nama, yang anda kemudian bisa lolos kegetattr
.Namun, perlu melakukan apa-apa dengan nama-nama variabel biasanya desain yang buruk. Mengapa tidak menjaga mereka dalam koleksi?
Anda kemudian dapat iterate atas tombol dengan
kunci dalam obj.special_values:
Seperti yang disebutkan dalam beberapa jawaban/komentar sudah, Python benda-benda yang sudah menyimpan kamus atribut mereka (metode aren't termasuk). Hal ini dapat diakses sebagai
__dict__
, tapi cara yang lebih baik adalah dengan menggunakanvar
(output adalah sama, meskipun). Perhatikan bahwa mengubah kamus ini akan mengubah atribut pada contoh! Hal ini dapat berguna, tetapi juga berarti anda harus berhati-hati dengan bagaimana anda menggunakan kamus ini. Berikut ini's contoh cepat:``python kelas A(): def init(self, x=3, y=2, z=5): mandiri.x = x mandiri._y = y self.z = z
def f(self): lulus
a = () cetak(var(a))
{'x': 3, '_y': 2, 'z': 5}
semua atribut dari
a
tapi tidak ada metode!perhatikan bagaimana kamus ini selalu up-to-date
a.x = 10 cetak(var(a))
{'x': 10, '_y': 2, 'z': 5}
mengubah kamus memodifikasi contoh atribut
vars(a)["_y"] = 20 cetak(var(a))
{'x': 10, '_y': 20, 'z': 5}
``
Menggunakan
dir(a)
adalah aneh, jika tidak langsung yang buruk, pendekatan untuk masalah ini. It's baik jika anda benar-benar diperlukan untuk iterate melalui semua atribut dan metode kelas (termasuk metode khusus seperti__init__
). Namun, hal ini tidak't tampaknya menjadi apa yang anda inginkan, dan bahkan jawaban yang diterima pergi tentang ini buruk dengan menerapkan beberapa rapuh penyaringan untuk mencoba untuk menghapus metode dan meninggalkan hanya satu atribut, anda dapat melihat bagaimana ini akan gagal untuk kelasA
yang didefinisikan di atas.(menggunakan
__dict__
telah dilakukan dalam beberapa jawaban, tetapi mereka semua tidak perlu mendefinisikan metode bukannya menggunakannya secara langsung. Hanya komentar menyarankan untuk menggunakanvar
).kemudian menyebutnya sebagai iterable
Jawaban yang benar untuk ini adalah bahwa anda tidak't. Jika anda ingin hal-hal baik hanya menggunakan dict, atau anda'll harus secara eksplisit menambahkan atribut untuk beberapa wadah. Anda dapat mengotomatisasi bahwa dengan belajar tentang dekorator.
Secara khusus, dengan cara, cara pemesanan1 dalam contoh anda adalah hanya sebagai baik suatu atribut.
Untuk python 3.6
Untuk python 3.6