Pythonã§ã¯ã©ã¹ãæžããŠãããšãã³ã³ã¹ãã©ã¯ã¿ã®äžã« self.name = nameãself.age = ageãself.address = addressâŠâŠãšãåããããªä»£å
¥æãããããšäžŠãã§ããŸãããšããããŸãããïŒãã£ãŒã«ãã5å10åãšå¢ããŠãããšãã³ãŒãã¯ã©ãã©ãèŠã«ãããªããæžãã®ãåå«ã«ãªããŸãããð®âðš
ãããªã¢ã€ã¢ã€ãäžæ°ã«è§£æ¶ããŠãããã®ããPython3.7ããå°å
¥ãããããŒã¿ã¯ã©ã¹ïŒdataclassïŒã§ããã¯ã©ã¹ã®äžã« @dataclass ãšäžè¡ã€ããã ãã§ãåæååŠçãèªåçæããŠãããããŸãã«ãããŒã¿ãæ ŒçŽããããã®ã¯ã©ã¹ãã«ç¹åããäŸ¿å©æ©èœã䜿ãããªãã°ãããªãã®ã³ãŒãã¯èŠéããã»ã©ã¹ãããªããéçºã¹ããŒããäžæ®µäžãããŸãâš
ããŒã¿ã¯ã©ã¹ãšã¯ããã®åã®ãšããããŒã¿ãæ ŒçŽããããšã«ç¹åããã¯ã©ã¹ã®ããšãPython3.7ããæšæºã©ã€ãã©ãªã«å ãã£ãä»çµã¿ã§ãdataclasses ã¢ãžã¥ãŒã«ãã dataclass ãã€ã³ããŒãããã¯ã©ã¹å®çŸ©ã®äžã«ãã³ã¬ãŒã¿ãŒãšããŠä»äžããã ãã§å©çšã§ããŸãã
ãã³ã¬ãŒã¿ãŒãšããã®ã¯ã@ ããŒã¯ã䜿ã£ãŠã¯ã©ã¹ã颿°ã«è¿œå æ©èœããè£
食ãããä»çµã¿ã®ããšã@dataclass ãä»ãããšããã£ãŒã«ãåãšåãæžãã ãã§ãååã®åŒæ°ãæã€ __init__ ã¡ãœãããèªåçæãããŸãã
æ®éã®ã¯ã©ã¹ã§ã¯ãã€ãã·ã£ã©ã€ã¶ã®äžã«ãã£ãŒã«ããžåŒæ°ã®å€ãèšå®ããã³ãŒããããæžããŸãããããŒã¿ã¯ã©ã¹ã¯ãããèªåã§çæããŠããããã§ãã
åŸæ¥ã®ãŠãŒã¶ãŒã¯ã©ã¹ãäŸã«æ¯èŒããŠã¿ãŸããããæ®éã®ã¯ã©ã¹ãªãããæžããŸãã
class User:
def __init__(self, name: str, age: int):
self.name = name
self.age = age ãããããŒã¿ã¯ã©ã¹ã§æžãæãããšããããªããŸãã
from dataclasses import dataclass
@dataclass
class User:
name: str
age: int åãåããããã¯ã©ã¹ãããã£ãæ°è¡ã§å®æðãã€ã³ã¹ã¿ã³ã¹åãããšã㯠User("äœè€", 20) ã®ããã«æžãã°ãã¡ãããš name="äœè€"ãage=20 ãèšå®ãããŸãããã£ãŒã«ããå¢ããã°å¢ããã»ã©ãããŒã¿ã¯ã©ã¹ã®æ©æµã¯å€§ãããªããŸãã
ãã£ãŒã«ãã«ããã©ã«ãå€ãæããããå Žåã¯ã颿°ã®åŒæ°ãšåãæèŠã§ = ã䜿ã£ãŠæå®ããŸãã
@dataclass
class User:
name: str
age: int = 20 ãã ãæ³šæç¹ã2ã€ãããã©ã«ãå€ããã®ãã£ãŒã«ãã¯ãããã©ã«ãå€ãªãã®ãã£ãŒã«ãããåŸãã«æžããªããšãšã©ãŒã«ãªããŸãïŒããã¯é¢æ°ã®åŒæ°å®çŸ©ãšåãã«ãŒã«ïŒããããŠããªã¹ãã»èŸæžã»éåãªã©ãã¥ãŒã¿ãã«ãªåã®ãã£ãŒã«ãã¯ç¹æ®ãªæžãæ¹ãå¿ èŠã§ãã
ããšãã°ã空ã®ãªã¹ãããããã©ã«ãå€ã«ããããšãã¯ãfield 颿°ã䜿ã£ãŠæ¬¡ã®ããã«æžããŸãã
from dataclasses import dataclass, field
@dataclass
class User:
name: str
items: list[int] = field(default_factory=list) èŸæžãªã default_factory=dictãéåãªã default_factory=set ãšæžãã°OKãäžèº«ã«å€ãå
¥ããŠãããããšãã¯ãdefault_factory=lambda: [1, 2, 3] ã®ããã«ã©ã ãåŒã§æž¡ããŠãããŸãããã
@dataclass(frozen=True) ãšæžããšãã€ã³ã¹ã¿ã³ã¹çæåŸã«ãã£ãŒã«ããæžãæããããªããªããŸãã詊ãã« user.age = 30 ã®ããã«ä»£å
¥ããããšãããšããfrozen instanceã®ãã£ãŒã«ãã«ã¯ä»£å
¥ã§ããŸããããšãããšã©ãŒãåºãŸããèšå®å€ã宿°ã®ãããªã€ãã¥ãŒã¿ãã«ãªããŒã¿ãæ±ããããšãã«éå®ããŸãã
æ®éã®ã¯ã©ã¹ã§ã¯ããã£ãŒã«ãã®äžèº«ããŸã£ããåãã§ãã€ã³ã¹ã¿ã³ã¹ãéãã° == ã®æ¯èŒã¯ Falseãã§ãããŒã¿ã¯ã©ã¹ãªãããã£ãŒã«ãã®å€ãäžèŽããŠããã° True ãè¿ããŠãããŸããããã¯å
éšã§ __eq__ ã¡ãœãããèªåçã«å€ããŒã¹ã®æ¯èŒãšããŠå®è£
ãããŠããããã§ããããŒã¿ã®åäžæ§ãæ±ãå Žé¢ã§ã¯éåžžã«çŽæçã§ããð
dataclasses.asdict(instance) ã䜿ããšãããŒã¿ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ããã£ãŒã«ãåãããŒãå€ãããªã¥ãŒãšããèŸæžã«å€æã§ããŸããJSONã§è¿ãAPIãããã°åºåããã¹ãã®æ¯èŒãªã©ã§å€§æŽ»èºããæ©èœã§ãã
from dataclasses import asdict
user = User(name="ãµã", age=20)
print(asdict(user))
# {'name': 'ãµã', 'age': 20} åç»ãèšäºã§åºæ¬ãã€ããã ããäœç³»çã«ãŸãšãŸã£ãæžç±ã§åå°ãåºããã®ãäžéãžã®è¿éã§ããããã§ã¯ãããŒã¿ã¯ã©ã¹ãå«ãçŸä»£çãªPythonã³ãŒãã£ã³ã°ãåŠã¹ãåèãå³éžããŠã玹ä»ããŸãð
ãã¯ã©ã¹ã£ãŠããããäœïŒããšããæ®µéã®äººã§ãå®å¿ããŠèªã¿é²ãããããPythonã®åºç€ããŠãããã«è§£èª¬ããå ¥éæžãææ³ããæ®µéçã«ã¹ãããã¢ããã§ããããŒã¿ã¯ã©ã¹ãçè§£ããããã®åå°ããã£ãã身ã«ã€ããŸãð±
åãã³ãŒããããèªã¿ãããä¿å®ããããã³ãŒãããžãåãã³ããããŒã¿ã¯ã©ã¹ã掻çšããã¢ãã³Pythonã®æžãæ¹ãåŠã¹ããçŸå Žã§è©äŸ¡ãããäžåã§ãðŒ
èšèªä»æ§ãæ·±ãçè§£ããPythonãããæžãæ¹ã身ã«ã€ããããªãå¿ èªãããŒã¿ã¯ã©ã¹ã»ãã³ã¬ãŒã¿ãŒã»åãã³ããªã©ãçŸä»£çãªæ©èœã®èæ¯ãŸã§èžã¿èŸŒãã§è§£èª¬ãããŠããŸãð§
ãã³ãºãªã³åœ¢åŒã§ã¢ããªãã¹ã¯ãªãããäœããªããåŠã¹ãæ¬ãããŒã¿ã¯ã©ã¹ãå®éã«ã©ããªå Žé¢ã§äœ¿ãã®ããå ·äœçã«ã€ã¡ãŒãžã§ããç¥èãã䜿ããæè¡ããžãšå€ãããŸãð
ããŒã¿ã¯ã©ã¹ãšçžæ§æçŸ€ã®ãåãã³ãããäœç³»çã«åŠã¹ãæ¬ãtyping ã¢ãžã¥ãŒã«ããããã³ã«ããžã§ããªã¯ã¹ãªã©ãå
ç¢ãªã³ãŒããæžãããã®ç¥èãäžæ°ã«æã«å
¥ããŸãð¡ïž
Python3.7ããæšæºã©ã€ãã©ãªã«å°å
¥ãããŸãããå€ãããŒãžã§ã³ã䜿ã£ãŠããå Žåã¯ãpip install dataclasses ã§ããã¯ããŒãçãã€ã³ã¹ããŒã«ã§ããŸãããç¹å¥ãªçç±ããªããã°ææ°ã®Pythonã䜿ãã®ãããããã§ãã
ãããŒã¿ãä¿æããããšãã¡ã€ã³ã®ç®çããªãããŒã¿ã¯ã©ã¹ããè€éãªããžãã¯ãç¶æ 管çãè¡ãããªãæ®éã®ã¯ã©ã¹ããšããã®ãåºæ¬æ¹éã§ãããã ããããŒã¿ã¯ã©ã¹ã«ãã¡ãœããã¯è¿œå ã§ããã®ã§ããŸãã¯ããŒã¿ã¯ã©ã¹ããå§ããŠå¿ èŠã«å¿ããŠæ¡åŒµããã®ãçŸå®çã§ãã
éåžžã®ä»£å
¥æäœã§ã¯æžãæããããŸããããå
éšçã«ã¯ object.__setattr__ ã䜿ãã°å€æŽå¯èœã§ãããšã¯ãããæç€ºçã«ã倿Žããªãããšããææè¡šç€ºãšããŠäœ¿ãã®ãæ¬æ¥ã®ç®çãªã®ã§ãæãéã䜿ãã®ã¯æšå¥šãããŸããã
ãã¥ãŒã¿ãã«ãªãªããžã§ã¯ããçŽæ¥ããã©ã«ãå€ã«æžããšãšã©ãŒã«ãªããŸããå¿
ã field(default_factory=list) ã®ããã«ããã¡ã¯ããªé¢æ°ãæž¡ããŠãã ãããããã¯ãå
šã€ã³ã¹ã¿ã³ã¹ã§åããªã¹ããå
±æããŠããŸããã°ããé²ãããã®Pythonã®å®å
𿩿§ã§ãã
Pydanticã¯ããªããŒã·ã§ã³æ©èœã匷åã§APIéçºãªã©ã«åããattrsã¯dataclassããæŽå²ãé·ã髿©èœãäžæ¹ãæšæºã©ã€ãã©ãªã®dataclassã¯è¿œå ã€ã³ã¹ããŒã«äžèŠã§è»œéã§ããã·ã³ãã«ãªããŒã¿ä¿æç®çãªãæšæºã®dataclassã§ååãªã±ãŒã¹ãå€ãã§ããã
ããŒã¿ã¯ã©ã¹ã䜿ãã°ããããŸã§äœè¡ãæžããŠããåæååŠçããã£ãäžè¡ã®ãã³ã¬ãŒã¿ãŒã§æžã¿ãã³ãŒãã¯ãã£ãšèªã¿ããããã¡ã³ããã³ã¹ãã©ã¯ã«ãªããŸããfrozen ã§å®å
šæ§ãé«ããããasdict ã§èŸæžåããããšãå®åã§åœ¹ç«ã€æ©èœãè±å¯ãäžåºŠäœ¿ãå§ãããšãããæ®éã®ã¯ã©ã¹ã«ã¯æ»ããªããããããŸããð
åç»ãèšäºã§ããµããµãããšçè§£ããç¥èããæžç±ã§äœç³»çã«è£åŒ·ããã°ãPythonã®äžçã¯ããã«åºãããŸãã仿¥ç޹ä»ãã5åããæ°ã«ãªãäžåãæã«åã£ãŠãããªãã®ã³ãŒããæ¬¡ã®ã¬ãã«ãžé²åãããŠã¿ãŠãã ããðâš
â ïž Windowsã»ãã¥ãªã…
ð§ çªç¶ã®æçš¿ã«ãã¡ã³éšç¶ïŒã©…
ð§© ããºã«ãè§£ãå¿«æãã³ãŒãã§…
âš ããã°ã©ã ã®åäœã軜ããã…
ð ãµãŒããŒãµã€ãéçºã®äžçãž…
âš é¢åãªWebäœæ¥ãèªååã…