Saya memiliki objek python dengan beberapa atribut dan metode. Saya ingin beralih pada atribut objek.
class my_python_obj(object):
attr1='a'
attr2='b'
attr3='c'
def method1(self, etc, etc):
#Statements
Saya ingin membuat kamus yang berisi semua atribut objek dan nilai-nilai mereka saat ini, tetapi saya ingin melakukannya dengan cara yang dinamis (jadi jika nanti saya menambahkan atribut lain saya tidak harus ingat untuk memperbarui fungsi saya juga).
Dalam variabel php dapat digunakan sebagai kunci, tetapi objek dalam python tidak dapat ditulis dan jika saya menggunakan notasi titik untuk ini, ia menciptakan atribut baru dengan nama var saya, yang bukan maksud saya.
Hanya untuk memperjelas:
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
Pembaruan: Dengan atribut yang saya maksud hanya variabel objek ini, bukan metode.
python
oop
attributes
iteration
Pablo Mescher
sumber
sumber
predicate
argumen opsional untuk meneruskan fungsi callable yang akan memfilter (terikat?) fungsi (yang menghilangkan metode).Jawaban:
Dengan asumsi Anda memiliki kelas seperti
memanggil
dir
objek memberi Anda kembali semua atribut objek itu, termasuk atribut khusus python. Meskipun beberapa atribut objek dapat dipanggil, seperti metode.Anda selalu dapat memfilter metode khusus dengan menggunakan pemahaman daftar.
atau jika Anda lebih suka peta / filter.
Jika Anda ingin menyaring metode, Anda dapat menggunakan builtin
callable
sebagai tanda centang.Anda juga bisa memeriksa perbedaan antara kelas Anda dan objek instansinya menggunakan.
sumber
callable
atautypes.MethodType
. Apa yang terjadi jika saya menambahkan atribut yang disebut "_foo" yang menyimpan beberapa hasil sementara, atau struktur data internal? Apa yang terjadi jika saya hanya menambahkan atribut ke kelas, tanpaname
, katakan, dan sekarang tiba-tiba itu dimasukkan._foo
danname
karena sekarang atribut dari objek. Jika Anda tidak ingin memasukkannya, Anda dapat mengecualikannya dalam kondisi pemahaman daftar. Kode di atas adalah idiom python umum dan cara populer mengintrospeksi objek python.dir()
hanya "kebohongan" ketika melewati metaclasses (kasus tepi ekstrem) atau kelas dengan atribut yang dihiasi oleh@DynamicClassAttribute
(kasus tepi ekstrem lain). Dalam kedua kasus, memanggildirs()
bungkusinspect.getmembers()
menyelesaikan ini. Untuk objek standar, bagaimanapun, pendekatan pemahaman daftar solusi ini menyaring non-callable benar - benar cukup. Bahwa beberapa Pythonistas akan menamakannya "ide buruk" membuatku bingung, tapi ... untuk masing-masing, kurasa?secara umum letakkan
__iter__
metode di kelas Anda dan beralih melalui atribut objek atau letakkan kelas mixin ini di kelas Anda.Kelas Anda:
sumber
one
dantwo
didefinisikan setelahyc = YourClass()
. Pertanyaan itu bertanya tentang perulangan melalui attris yang ada diYourClass()
. Juga, mewarisiIterMixin
kelas mungkin tidak selalu tersedia sebagai solusi.vars(yc)
memberikan hasil yang sama tanpa harus mewarisi dari kelas lain.vars(yc)
hampir sama, tetapi kamus yang mengembalikan Anda adalah milik instance__dict__
, jadi memodifikasi itu akan tercermin pada instance. Ini dapat menyebabkan masalah jika Anda tidak berhati-hati, sehingga metode di atas terkadang lebih baik (meskipun menyalin kamus mungkin lebih mudah). Juga, perhatikan bahwa meskipun kamus yang dikembalikan di atas bukan milik instance__dict__
, nilainya sama, jadi memodifikasi nilai yang dapat diubah dapat tetap tercermin dalam atribut instance.Seperti yang disebutkan dalam beberapa jawaban / komentar sudah, objek Python sudah menyimpan kamus atribut mereka (metode tidak termasuk). Ini dapat diakses sebagai
__dict__
, tetapi cara yang lebih baik adalah dengan menggunakanvars
(outputnya sama, meskipun). Perhatikan bahwa memodifikasi kamus ini akan mengubah atribut pada instance! Ini bisa bermanfaat, tetapi juga berarti Anda harus berhati-hati dengan cara Anda menggunakan kamus ini. Ini contoh singkatnya:Menggunakan
dir(a)
adalah pendekatan yang aneh, jika tidak langsung buruk, untuk masalah ini. Baik jika Anda benar-benar perlu untuk mengulangi semua atribut dan metode kelas (termasuk metode khusus seperti__init__
). Namun, ini sepertinya bukan yang Anda inginkan, dan bahkan jawaban yang diterima mengenai hal ini buruk dengan menerapkan beberapa penyaringan getas untuk mencoba menghapus metode dan hanya meninggalkan atribut; Anda dapat melihat bagaimana ini akan gagal untuk kelas yangA
ditentukan di atas.(menggunakan
__dict__
telah dilakukan dalam beberapa jawaban, tetapi mereka semua mendefinisikan metode yang tidak perlu daripada menggunakannya secara langsung. Hanya komentar yang menyarankan untuk menggunakanvars
).sumber
a.b
beberapa kelas khususB
makavars(a)["b"] is a.b
, seperti yang diharapkan; tidak ada hal lain yang benar-benar masuk akal (anggapa.b
sebagai gula sintaksisa.__dict__["b"]
). Jika Anda memilikid = vars(a)
dan memanggilrepr(d)
maka itu akan memanggilrepr(d["b"])
sebagai bagian dari mengembalikan itu sendiri repr-string karena hanya kelas yangB
benar-benar tahu bagaimana itu harus direpresentasikan sebagai string.Objek dalam python menyimpan atribut mereka (termasuk fungsi) dalam sebuah dict yang disebut
__dict__
. Anda dapat (tetapi umumnya tidak boleh) menggunakan ini untuk mengakses atribut secara langsung. Jika Anda hanya ingin daftar, Anda juga bisa menelepondir(obj)
, yang mengembalikan iterable dengan semua nama atribut, yang kemudian bisa Anda sampaikan kegetattr
.Namun, perlu melakukan apa pun dengan nama-nama variabel biasanya desain yang buruk. Mengapa tidak menyimpannya di koleksi?
Anda kemudian dapat beralih di atas tombol dengan
for key in obj.special_values:
sumber
maka sebut saja itu sebagai iterable
sumber
Jawaban yang benar untuk ini adalah bahwa Anda seharusnya tidak melakukannya. Jika Anda menginginkan hal semacam ini, gunakan saja dict, atau Anda harus menambahkan atribut secara eksplisit ke suatu wadah. Anda dapat mengotomatiskannya dengan mempelajari tentang dekorator.
Secara khusus, metode1 pada contoh Anda sama baiknya dengan atribut.
sumber
Untuk python 3.6
sumber
Untuk semua fanatik pythonian di luar sana, saya yakin Johan Cleeze akan menyetujui dogmatisme Anda;). Saya meninggalkan jawaban ini terus-menerus meremehkannya. Itu sebenarnya membuat saya lebih percaya diri. Tinggalkan komentar kamu ayam!
Untuk python 3.6
sumber