Python Academy · Pelajaran

Nilai Lalai dan field()

Tetapkan nilai lalai dan gunakan pilihan field().

Pelajaran 2 daripada 413 langkah

Nilai Lalai dan field() ialah pelajaran Python Academy percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Python Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Python Academy merangkumi sejumlah 4 pelajaran.

Memberikan Nilai Lalai kepada Medan

Seperti parameter fungsi, medan dataclass boleh mempunyai nilai lalai. Medan yang mempunyai nilai lalai boleh ditiadakan semasa mencipta tika.

from dataclasses import dataclass

@dataclass
class Server:
    host: str
    port: int = 8080

print(Server('localhost'))
print(Server('example.com', 443))

Susunan Penting

Medan dengan nilai lalai mesti diletakkan selepas medan tanpa nilai lalai, sama seperti argumen fungsi. Jika tidak, Python akan menimbulkan TypeError apabila kelas ditakrifkan.

from dataclasses import dataclass

@dataclass
class User:
    name: str       # required
    active: bool = True   # optional

print(User('Alice'))

Perangkap Nilai Lalai Boleh Diubah

Anda tidak boleh menggunakan objek boleh ubah seperti senarai atau kamus sebagai nilai lalai langsung. Semua tika akan berkongsi objek yang sama. Python mengesan perkara ini dan menimbulkan ValueError untuk melindungi anda.

from dataclasses import dataclass
from typing import List

# This raises ValueError at class definition time:
try:
    @dataclass
    class Bad:
        items: List[int] = []
except ValueError as e:
    print('Error:', e)

field(default_factory=...)

Untuk memberikan nilai lalai yang boleh diubah, gunakan field(default_factory=...). Kilang tersebut dipanggil untuk setiap tika baharu, jadi setiap tika mendapat objek baharu miliknya sendiri.

from dataclasses import dataclass, field
from typing import List

@dataclass
class Cart:
    items: List[str] = field(default_factory=list)

a = Cart()
a.items.append('apple')
b = Cart()
print(a.items, b.items)

default berbanding default_factory

Gunakan field(default=...) untuk nilai tidak boleh ubah apabila anda juga memerlukan pilihan field() yang lain. Gunakan default_factory untuk apa-apa yang boleh diubah. Anda tidak boleh menghantar kedua-duanya serentak.

from dataclasses import dataclass, field

@dataclass
class Config:
    retries: int = field(default=3)
    tags: list = field(default_factory=list)

print(Config())

Mengecualikan Medan daripada repr

Pilihan repr=False menyembunyikan medan daripada __repr__ yang dijana. Ini berguna untuk rahsia atau penimbal dalaman yang besar.

from dataclasses import dataclass, field

@dataclass
class Account:
    user: str
    token: str = field(repr=False, default='secret')

print(Account('alice'))

Mengecualikan Medan daripada Perbandingan

Dengan compare=False, medan diabaikan oleh __eq__ yang dijana (dan susunan). Dua tika boleh dianggap sama walaupun medan tersebut berbeza.

from dataclasses import dataclass, field

@dataclass
class Event:
    name: str
    timestamp: float = field(compare=False, default=0.0)

print(Event('login', 1.0) == Event('login', 99.0))

Medan init=False

Menetapkan init=False mengeluarkan medan daripada __init__. Biasanya anda menggabungkannya dengan nilai lalai atau menetapkannya dalam __post_init__.

from dataclasses import dataclass, field

@dataclass
class Circle:
    radius: float
    area: float = field(init=False, default=0.0)

c = Circle(2.0)
print(c)

__post_init__ untuk Nilai Terbitan

Takrifkan __post_init__ untuk menjalankan kod sejurus selepas __init__ yang dijana. Inilah tempat yang sesuai untuk mengira medan yang terbit daripada medan lain.

from dataclasses import dataclass, field

@dataclass
class Circle:
    radius: float
    area: float = field(init=False, default=0.0)

    def __post_init__(self):
        self.area = 3.14159 * self.radius ** 2

print(Circle(2.0))

Menyimpan Metadata

Argumen metadata melampirkan pemetaan sewenang-wenangnya pada medan. Python mengabaikannya, tetapi alat dan kod anda sendiri boleh membacanya untuk mendapatkan petunjuk dokumentasi atau pengesahan.

from dataclasses import dataclass, field, fields

@dataclass
class Product:
    price: float = field(metadata={'unit': 'USD'})

for f in fields(Product):
    print(f.name, f.metadata)

Menggabungkan Pilihan field()

Pilihan-pilihan ini boleh digabungkan. Satu medan boleh disembunyikan daripada repr, dikecualikan daripada perbandingan dan mempunyai nilai lalai pada masa yang sama.

from dataclasses import dataclass, field

@dataclass
class Session:
    user: str
    token: str = field(default='x', repr=False, compare=False)

print(Session('alice'))
print(Session('alice') == Session('alice', token='different'))

Semakan Ringkas

Bagaimanakah anda memberikan senarai kosong sebagai nilai lalai bagi medan dataclass?

Ringkasan

Anda telah mempelajari cara menetapkan nilai lalai dan menggunakan pilihan field().

  • Medan dengan nilai lalai diletakkan selepas medan yang diperlukan.
  • Gunakan default_factory untuk nilai lalai yang boleh diubah.
  • repr, compare, init dan metadata melaraskan setiap medan.
  • __post_init__ mengira nilai terbitan.
Percuma untuk bermula

Pelajari Python dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
76
Pelajaran
320

Soalan Lazim

Adakah pelajaran “Nilai Lalai dan field()” percuma?

Ya — teks penuh “Nilai Lalai dan field()” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Python Academy, tingkat taraf kepada CoddyKit PRO. Kursus Python Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Nilai Lalai dan field()”?

Tetapkan nilai lalai dan gunakan pilihan field(). Anda berlatih Python Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Python Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Python Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.

Berapa lamakah pelajaran “Nilai Lalai dan field()” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Python Academy ini?

Ya. Setiap pelajaran Python Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Mentakrifkan Dataclass
  2. Nilai Lalai dan field()
  3. Pilihan Pembekuan dan Perbandingan
  4. Pustaka attrs
← Kembali ke Python Academy