Dengan PEP 557 kelas data dimasukkan ke pustaka standar python.
Mereka menggunakan @dataclass
dekorator dan mereka seharusnya menjadi "nama yang dapat diubah dengan standar" tetapi saya tidak begitu yakin saya mengerti apa arti sebenarnya dan bagaimana mereka berbeda dari kelas umum.
Apa sebenarnya kelas data python dan kapan waktu terbaik untuk menggunakannya?
python
class
python-3.7
python-dataclasses
raja julian
sumber
sumber
namedtuple
s tidak dapat diubah dan tidak dapat memiliki nilai default untuk atribut, sedangkan kelas data bisa berubah dan dapat memilikinya.@dataclass
tidak akan menyebabkan situs hancur.namedtuples
BISA memiliki nilai default. Lihat di sini: stackoverflow.com/questions/11351032/…Jawaban:
Kelas data hanyalah kelas reguler yang diarahkan untuk menyimpan keadaan, lebih dari mengandung banyak logika. Setiap kali Anda membuat kelas yang sebagian besar terdiri dari atribut Anda membuat kelas data.
Apa yang dilakukan
dataclasses
modul adalah membuatnya lebih mudah untuk membuat kelas data. Itu mengurus banyak pelat ketel untuk Anda.Ini sangat penting ketika kelas data Anda harus hashable; ini membutuhkan
__hash__
metode dan__eq__
metode. Jika Anda menambahkan__repr__
metode khusus untuk kemudahan debugging, itu bisa menjadi sangat bertele-tele:Dengan
dataclasses
Anda dapat menguranginya menjadi:Kelas dekorator yang sama juga dapat menghasilkan metode perbandingan (
__lt__
,__gt__
, dll) dan menangani kekekalan.namedtuple
kelas juga kelas data, tetapi tidak dapat diubah secara default (juga urutannya).dataclasses
jauh lebih fleksibel dalam hal ini, dan dapat dengan mudah disusun sedemikian rupa sehingga mereka dapat mengisi peran yang sama dengannamedtuple
kelas .PEP terinspirasi oleh
attrs
proyek , yang dapat melakukan lebih banyak lagi (termasuk slot, validator, konverter, metadata, dll.).Jika Anda ingin melihat beberapa contoh, saya baru-baru ini menggunakan
dataclasses
beberapa solusi Advent of Code saya , lihat solusi untuk hari 7 , hari 8 , hari 11 dan hari 20 .Jika Anda ingin menggunakan
dataclasses
modul dalam versi Python <3.7, maka Anda dapat menginstal modul backported (memerlukan 3.6) atau menggunakanattrs
proyek yang disebutkan di atas.sumber
@dataclass
menghasilkan__init__
metode yang kira-kira sama , denganquantity_on_hand
argumen kata kunci dengan nilai default. Saat Anda membuat instance, itu akan mengaturquantity_on_hand
atribut instance, selalu. Jadi contoh pertama saya , non-dataclass menggunakan pola yang sama untuk mengulangi apa yang akan dilakukan kode dataclass.__post_init__
metode ini.Gambaran
Pertanyaannya telah diatasi. Namun, jawaban ini menambahkan beberapa contoh praktis untuk membantu dalam pemahaman dasar kacamata.
namedtuple
dan lainnya .Inilah yang dimaksud frasa terakhir:
namedtuple
kelas biasa atau.Dibandingkan dengan kelas umum, Anda lebih menghemat mengetik kode boilerplate.
fitur
Ini adalah gambaran umum fitur-fitur dataclass (TL; DR? Lihat Tabel Ringkasan di bagian selanjutnya).
Apa yang kau dapatkan
Berikut adalah fitur-fitur yang Anda dapatkan dari kacamata standar.
Atribut + Representasi + Perbandingan
Default ini disediakan dengan secara otomatis mengatur kata kunci berikut untuk
True
:Apa yang bisa Anda nyalakan
Fitur tambahan tersedia jika kata kunci yang sesuai diatur ke
True
.Memesan
Metode pemesanan sekarang diterapkan (operator kelebihan beban:)
< > <= >=
, mirip denganfunctools.total_ordering
dengan uji kesetaraan yang lebih kuat.Hashable, Mutable
Meskipun objek berpotensi berubah (mungkin tidak diinginkan), hash diimplementasikan.
Hashable, Immutable
Hash sekarang diimplementasikan dan mengubah objek atau menugaskan ke atribut tidak diizinkan.
Secara keseluruhan, objek tersebut dapat di hash jika salah satu
unsafe_hash=True
ataufrozen=True
.Lihat juga tabel logika hashing asli dengan detail lebih lanjut.
Apa yang tidak Anda dapatkan
Untuk mendapatkan fitur berikut, metode khusus harus diterapkan secara manual:
Membongkar
Optimasi
Ukuran objek sekarang berkurang:
Dalam beberapa keadaan,
__slots__
juga meningkatkan kecepatan membuat instance dan mengakses atribut. Juga, slot tidak memungkinkan penetapan standar; jika tidak, aValueError
dinaikkan.Lihat lebih banyak di slot di posting blog ini .
Tabel Ringkasan
+ Metode-metode ini tidak dihasilkan secara otomatis dan membutuhkan implementasi manual dalam sebuah dataclass.
*
__ne__
tidak diperlukan dan karenanya tidak diterapkan .Fitur tambahan
Pasca inisialisasi
Warisan
Konversi
Ubah dataclass menjadi tuple atau dict, secara rekursif :
Keterbatasan
Referensi
sumber
Dari spesifikasi PEP :
The
@dataclass
Generator menambahkan metode untuk kelas yang Anda sebaliknya akan mendefinisikan diri sendiri seperti__repr__
,__init__
,__lt__
, dan__gt__
.sumber
Pertimbangkan kelas sederhana ini
Foo
Berikut ini adalah
dir()
perbandingan built-in. Di sisi kiri adalahFoo
tanpa dekorator @dacaclass, dan di kanan adalah dekorator @dacaclass.Berikut ini perbedaan lain, setelah menggunakan
inspect
modul untuk perbandingan.sumber