Python
field()
field(default_factory=...) ile varsayılan değerleri öğrenirsin.
field() ne işe yarar?
Bir alanın varsayılanı değişebilir bir nesne ise (liste, sözlük, küme) doğrudan = [] yazamazsın; Python bunu tüm örneklerde paylaştırır. Bunun yerine field(default_factory=list) kullanırsın; her yeni örneğe ayrı boş liste üretilir.
Örnek: members: list = field(default_factory=list). Bu satır, her yeni örnekte list() çağrısını yapar ve ayrı bir boş liste verir. default_factory'ye dict, set ya da kendi işlevini de verebilirsin.
Paylaşılan liste tuzağı
Eğer members: list = [] yazarsan Python tüm örneklerde aynı listeyi kullanır. Bu, çok ince bir hatadır: bir örneğe eklediğin öğe başka bir örnekte de görünür. field(default_factory=list) bu tuzağı tamamen ortadan kaldırır.
Benzer şekilde sözlük için field(default_factory=dict), küme için field(default_factory=set) kullanılır. Değişmez türler için (int, str, tuple) doğrudan varsayılan yazabilirsin; sorun çıkmaz.
Uygulama Team sınıfına field ekle
from dataclasses import dataclass, field ile başla. @dataclass ile Team sınıfını tanımla; name: str = "" ve members: list = field(default_factory=list) alanlarını ekle. Sınıfa def add(self, m): metodu ekle, gövdede self.members.append(m) yaz. Sonra t = Team(name="Yıldızlar") ile örnek oluştur, t.add("Ayşe") ile üye ekle ve print(len(t.members)) ile yazdır.
Örnek çözümü göster
# Team veri sınıfını field ile yaz
from dataclasses import dataclass, field
@dataclass
class Team:
name: str = ""
members: list = field(default_factory=list)
def add(self, m):
self.members.append(m)
t = Team(name="Yıldızlar")
t.add("Ayşe")
print(len(t.members))
Kendini test et
-
default_factory çağrısını tamamla
from dataclasses import dataclass, field
@dataclass
class Team:
name: str = ""
members: list = field(default_factory=____)
def add(self, m):
self.members.append(m)
Cevabı göster
from dataclasses import dataclass, field
@dataclass
class Team:
name: str = ""
members: list = field(default_factory=list)
def add(self, m):
self.members.append(m)
-
members: list = [] neye yol açar?
- Sözdizimi hatası
- Hiçbir şey, sorun yok
- Otomatik boş liste üretir
- Tüm örnekler aynı listeyi paylaşır
Cevabı göster
Tüm örnekler aynı listeyi paylaşır — Doğrudan [] tüm örneklerde aynı liste paylaşılır; bu bir hatadır.
-
field() parçalarını eşleştir
- field
- İşlev
- default_factory
- Fabrika argümanı
- list
- Boş liste üretir
- dict
- Boş sözlük üretir
Sıradaki ders: frozen