Apakah mungkin untuk membuat objek dari kamus dengan python sedemikian rupa sehingga setiap kunci adalah atribut dari objek itu?
Sesuatu seperti ini:
d = { 'name': 'Oscar', 'lastName': 'Reyes', 'age':32 }
e = Employee(d)
print e.name # Oscar
print e.age + 10 # 42
Saya pikir itu akan menjadi kebalikan dari pertanyaan ini: kamus Python dari bidang objek
python
dictionary
properties
attributes
initialization
OscarRyz
sumber
sumber
def __init__(self,**initial_data)
Anda mendapatkan keuntungan tambahan karena memiliki metode init yang juga dapat melakukan argumen kata kunci juga (mis. "E = Employee (name = 'Oscar')" atau hanya membaca kamus (mis. "E = Employee ( ** dict) ").Employee(some_dict)
danEmployee(**some_dict)
API tidak konsisten. Mana yang lebih baik harus disediakan.()
bukanNone
, Anda bisa melakukannya suka begitu:def __init__(self, iterable=(), **kwargs): self.__dict__.update(iterable, **kwargs)
.[[setattr(self,key,d[key]) for key in d] for d in some_dict]
AddressNotFoundError
(untuk mengembalikan data yang dikoreksi dalam kasus itu, daripada meledak) - Saya merasa gila bahwa sesuatu yang begitu mudah di PHP ((object) ['x' => 'y']
) membutuhkan begitu banyak cruft dengan PythonMenetapkan atribut dengan cara ini hampir pasti bukan cara terbaik untuk memecahkan masalah. Antara:
Anda tahu apa yang harus dilakukan sebelumnya. Dalam hal ini, Anda dapat menyetel semua atribut secara eksplisit. Ini akan terlihat seperti
atau
Anda tidak tahu apa yang harus dilakukan sebelumnya. Dalam kasus ini, Anda harus menyimpan data sebagai dict alih-alih mencemari namespace objek. Atribut untuk akses statis. Kasus ini akan terlihat seperti ini
Solusi lain yang pada dasarnya setara dengan kasus 1 adalah dengan menggunakan a
collections.namedtuple
. Lihat jawaban van untuk cara mengimplementasikannya.sumber
Anda dapat mengakses atribut suatu objek dengan
__dict__
, dan memanggil metode pembaruan di atasnya:sumber
__dict__
adalah artefak implementasi dan tidak boleh digunakan. Juga, ini mengabaikan keberadaan deskriptor di kelas.__dict__
adalah bagian bahasa yang terdokumentasi, bukan artefak implementasi.setattr
lebih disukai daripada mengakses__dict__
secara langsung. Anda harus mengingat banyak hal yang dapat menyebabkan Anda__dict__
tidak berada di sana atau tidak melakukan apa yang Anda inginkan saat menggunakannya__dict__
, tetapisetattr
hampir identik dengan benar-benar melakukanfoo.bar = baz
.__dict__
tidak disarankan: docs.python.org/tutorial/classes.html#id2Mengapa tidak menggunakan nama atribut sebagai kunci kamus?
Anda dapat menginisialisasi dengan argumen bernama, daftar tupel, atau kamus, atau penetapan atribut individu, misalnya:
Alternatifnya, alih-alih memunculkan kesalahan atribut, Anda dapat mengembalikan Tidak Ada untuk nilai yang tidak diketahui. (Trik yang digunakan di kelas penyimpanan web2py)
sumber
Saya pikir penggunaan jawaban
settattr
adalah cara yang harus dilakukan jika Anda benar-benar membutuhkan dukungandict
.Tetapi jika
Employee
objek hanyalah sebuah struktur yang dapat Anda akses dengan sintaks titik (.name
) alih-alih sintaks dict (['name']
), Anda dapat menggunakan namapuple seperti ini:Anda memang memiliki
_asdict()
metode untuk mengakses semua properti sebagai kamus, tetapi Anda tidak dapat menambahkan atribut tambahan nanti, hanya selama konstruksi.sumber
katakanlah misalnya
jika Anda ingin mengatur atribut sekaligus
sumber
a.__dict__.update(x=100, y=300, z="blah")
mirip dengan menggunakan dict, Anda bisa menggunakan kwargs seperti ini:
sumber