Python3.7 memperkenalkan kelas data. Penghias kelas data boleh mengisytiharkan kelas Python sebagai kelas data sesuai untuk menyimpan data Secara umumnya, ia mempunyai ciri-ciri berikut:
Kelas data mewakili data tertentu. jenis, dan objek data mewakili Entiti kelas tertentu yang mengandungi sifat entiti.
Objek dari jenis yang sama boleh dibandingkan sebagai contoh, lebih besar daripada, kurang daripada, atau sama dengan;
Takrif kelas data
Secara sifatnya, tiada apa yang istimewa tentang kelas data, kecuali penghias @dataclass secara automatik menjana __repr__, init, __eq__ dan satu siri kaedah. Tentukan kelas data:
from dataclasses import dataclass
@dataclass
class A:
normal: str
defVal: int = 0
Penghias
Bentuk lengkap kelas data ialah (Benar adalah untuk menjana kaedah yang sepadan, Palsu tidak akan dihasilkan; jika kaedah yang sepadan telah ditakrifkan dalam class, parameter ini diabaikan) :
@dataclass(init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False):
init: lalai Kaedah __init__ akan dijana;
repr: Kaedah __repr__ akan dijana secara lalai; repr (dalam susunan yang ditakrifkan dalam kelasnya );
eq: Kaedah __eq__ akan dihasilkan secara lalai; tetapi akan mewarisi objek.__eq__ (bandingkan id ); >unsafe_hash: jika ia False (default) , kaedah __hash__() (digunakan oleh hash() terbina dalam) dijana berdasarkan cara persamaan dan beku ditetapkan.
-
Jika eq dan beku kedua-duanya benar, kaedah __hash__() akan dijana secara lalai;
-
Jika eq benar manakala beku adalah palsu, __hash__() akan ditetapkan kepada Tiada, menandakannya sebagai tidak boleh dicincang (iaitu, kerana ia boleh berubah-ubah); akan kekal tidak berubah, yang bermaksud kaedah __hash__() superclass akan digunakan (sandaran kepada pencincangan berasaskan id jika superclass adalah objek).
-
beku: Jika benar, atribut tidak boleh diubah suai selepas contoh dimulakan; Lulus Kaedah medan, atribut boleh disesuaikan:
dataclasses.field(*, default=MISSING, default_factory=MISSING, repr=True, hash=None, init=True, compare=True, metadata=None):
lalai: Jika disediakan, ini akan menjadi nilai lalai untuk medan ini. default_factory: digunakan untuk menentukan medan dengan nilai lalai berubah Ia mestilah objek boleh panggil tanpa parameter yang saling eksklusif dengan lalai (tidak boleh dinyatakan pada masa yang sama).
-
init: Jika benar (lalai), medan ini disertakan sebagai parameter dalam kaedah __init__() yang dihasilkan.
repr: Jika benar (lalai), medan disertakan dalam rentetan yang dikembalikan oleh kaedah __repr__() yang dihasilkan.
bandingkan: Jika benar (lalai), medan disertakan dalam kesamaan yang dijana dan kaedah perbandingan (__eq__(), __gt__(), dsb.). cincang: Boleh menjadi Boolean atau Tiada: ialah Tiada (lalai), nilai perbandingan digunakan, yang biasanya dijangka tingkah laku (menetapkan nilai ini kepada apa-apa selain None adalah tidak digalakkan); >- Satu sebab yang mungkin untuk menetapkan cincangan=Salah tetapi bandingkan=Benar (iaitu, mengecualikan medan daripada cincang tetapi masih menggunakannya untuk perbandingan) ialah pengiraan cincang medan adalah sangat mahal;
- metadata: Ini boleh menjadi peta atau Tiada satu pun dianggap sebagai kamus kosong. Nilai ini terkandung dalam MappingProxyType(), menjadikannya baca sahaja dan terdedah pada objek Field (disediakan sebagai mekanisme sambungan pihak ketiga).
- Gunakan default_factory untuk menjana nilai lalai:
Initialize Kelas diubah suai oleh penghias kelas data:
-
Tidak perlu mentakrifkan __init__, kelas data akan mengendalikannya secara automatik; ;
dataclass akan menambah fungsi __repr__ secara automatik; = Benar) Tambah kaedah perbandingan (__eq__ dan __lt__):
perbandingan dilakukan melalui tuple yang dihasilkan oleh atribut (medan seperti di atas, tuple perbandingan adalah (normal, defVale) - melalui compare=False , anda boleh menetapkan medan yang tidak digunakan untuk perbandingan:
Pemprosesan pasca-
Pemprosesan pasca boleh dilakukan melalui __post_init__ (dipanggil secara automatik sebelum __init__ kembali):
kaedah kelas data
sifat dan kaedah terbina dalam kelas data:
from dataclasses import dataclass, field
import random
def build_marks() -> list:
return [random.randint(0, 1000) for i in range(5)]
@dataclass(order=True)
class RandMark:
marks: list = field(default_factory=build_marks)
r = RandMark() # 使用build_marks生成默认值
print(r)
medan(class_or_instance): Mengembalikan sekumpulan objek Medan medan; >
asdict(instance, *, dict_factory=dict): Tukar kelas data kepada kamus, (nama:value) pasangan; astuple(instance, *, tuple_factory =tuple): Tukar kelas data kepada tuple; replace(instance, **changes): Buat objek baharu daripada jenis yang sama seperti instance, perubahan ialah nilai yang akan diubahsuai.
Atas ialah kandungan terperinci Bagaimanakah kelas data digunakan dalam Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!