Perhatikan bahwa praktik terbaik dalam Python 2.7 adalah menggunakan kelas gaya baru (tidak diperlukan dengan Python 3), yaitu
class Foo(object):
...
Juga, ada perbedaan antara 'objek' dan 'kelas'. Untuk membuat kamus dari objek yang arbitrer , cukup untuk digunakan __dict__
. Biasanya, Anda akan mendeklarasikan metode Anda di tingkat kelas dan atribut Anda di tingkat instance, jadi __dict__
harus baik-baik saja. Sebagai contoh:
>>> class A(object):
... def __init__(self):
... self.b = 1
... self.c = 2
... def do_nothing(self):
... pass
...
>>> a = A()
>>> a.__dict__
{'c': 2, 'b': 1}
Pendekatan yang lebih baik (disarankan oleh robert dalam komentar) adalah vars
fungsi bawaan :
>>> vars(a)
{'c': 2, 'b': 1}
Atau, tergantung pada apa yang ingin Anda lakukan, mungkin lebih baik untuk mewarisi dari dict
. Kemudian kelas Anda sudah menjadi kamus, dan jika Anda mau, Anda dapat mengganti getattr
dan / atau setattr
untuk memanggil dan mengatur dict. Sebagai contoh:
class Foo(dict):
def __init__(self):
pass
def __getattr__(self, attr):
return self[attr]
# etc...
__dict__
tidak akan berfungsi jika objek menggunakan slot (atau didefinisikan dalam modul C).vars(a)
melakukan ini? Bagi saya itu lebih baik untuk memohon__dict__
langsung.__getattr__ = dict.__getitem__
persis mereplikasi perilaku, maka Anda juga ingin__setattr__ = dict.__setitem__
dan__delattr__ = dict.__delitem__
untuk melengkapi.Alih-alih
x.__dict__
, itu sebenarnya lebih pythonic untuk digunakanvars(x)
.sumber
MyClass(**my_dict)
, dengan asumsi Anda telah mendefinisikan konstruktor dengan parameter yang mencerminkan atribut kelas. Tidak perlu mengakses atribut pribadi atau mengganti dict.vars
fungsi dan memperkenalkan fungsi tambahan tanpa mengubah objek itu sendiri.__slots__
.vars
, yaitu untuk mengembalikan setara dengan__dict__
untuk kelas "ditempatkan". Untuk saat ini, ini dapat ditiru dengan menambahkan__dict__
properti yang kembali{x: getattr(self, x) for x in self.__slots__}
(tidak yakin apakah itu mempengaruhi kinerja atau perilaku dengan cara apa pun).The
dir
builtin akan memberikan semua atribut objek, termasuk metode khusus seperti__str__
,__dict__
dan sejumlah orang lain yang Anda mungkin tidak ingin. Tetapi Anda dapat melakukan sesuatu seperti:Jadi dapat memperluas ini hanya mengembalikan atribut data dan bukan metode, dengan mendefinisikan
props
fungsi Anda seperti ini:sumber
ismethod
tidak menangkap fungsi. Contoh:inspect.ismethod(str.upper)
.inspect.isfunction
tidak jauh lebih bermanfaat. Tidak yakin bagaimana cara mendekati ini segera.Saya sudah puas dengan kombinasi kedua jawaban:
sumber
staticmethod
? Bukan itucallable
.Saya pikir saya akan meluangkan waktu untuk menunjukkan kepada Anda bagaimana Anda dapat menerjemahkan objek untuk didiktekan
dict(obj)
.Bagian kunci dari kode ini adalah
__iter__
fungsinya.Seperti yang dijelaskan dalam komentar, hal pertama yang kami lakukan adalah mengambil item-item Kelas dan mencegah apa pun yang dimulai dengan '__'.
Setelah Anda membuat itu
dict
, maka Anda dapat menggunakanupdate
fungsi dict dan mengirimkan instance__dict__
.Ini akan memberi Anda kamus anggota + kelas + instance lengkap. Sekarang yang tersisa adalah beralih pada mereka dan menghasilkan pengembalian.
Juga, jika Anda berencana untuk menggunakan ini banyak, Anda dapat membuat
@iterable
dekorator kelas.sumber
dict((x, y) for x, y in KpiRow.__dict__.items() if x[:2] != '__' and not callable(y))
akan menyelesaikannya? Tapi masih adastatic
metode :(Ini melewatkan atribut yang diwarisi objek dari kelasnya. Sebagai contoh,
hasattr (a, 'x') benar, tetapi 'x' tidak muncul dalam .__ dict__
sumber
vars()
tidak berfungsidir
adalah solusi dalam kasus ini. Lihat jawaban lain tentang itu.Jawaban terlambat tetapi disediakan untuk kelengkapan dan manfaat para pengguna Google:
Ini tidak akan menunjukkan metode yang didefinisikan di kelas, tetapi masih akan menampilkan bidang termasuk yang ditugaskan untuk lambdas atau yang dimulai dengan garis bawah ganda.
sumber
Saya pikir cara termudah adalah membuat atribut getitem untuk kelas. Jika Anda perlu menulis ke objek, Anda dapat membuat setattr khusus . Berikut ini adalah contoh untuk getitem :
dikt menghasilkan atribut objek menjadi kamus dan objek kamus dapat digunakan untuk mendapatkan item yang Anda butuhkan.
sumber
Kelemahan menggunakan
__dict__
adalah bahwa itu dangkal; itu tidak akan mengonversi subclass apa pun ke kamus.Jika Anda menggunakan Python3.5 atau lebih tinggi, Anda dapat menggunakan
jsons
:sumber
Jika Anda ingin membuat daftar bagian dari atribut Anda, ganti
__dict__
:Ini sangat membantu jika Anda
instance
mendapatkan beberapa data blok besar dan Anda ingin mendorongd
ke Redis seperti antrian pesan.sumber
__dict__
adalah atribut, bukan metode, jadi contoh ini mengubah antarmuka (yaitu Anda harus menyebutnya sebagai callable), jadi itu bukan menimpanya.PYTHON 3:
Sekarang Anda dapat menggunakan kode di atas di dalam kelas Anda sendiri:
sumber
vars()
bagus, tetapi tidak berfungsi untuk objek objek bersarangKonversi objek objek bersarang menjadi dikt:
sumber