Javaμ Lombok @Dataλ recordμ²λΌ, 보μΌλ¬νλ μ΄νΈ μμ΄ λ°μ΄ν° ν΄λμ€λ₯Ό λ§λλ λ°©λ².
@dataclassλ λ°μ΄ν°λ₯Ό μ μ₯νλ ν΄λμ€λ₯Ό κ°νΈνκ² λ§λ€μ΄μ£Όλ λ°μ½λ μ΄ν°λ‘, λ°λ³΅μ μΈ λ³΄μΌλ¬νλ μ΄νΈ μ½λλ₯Ό μλμΌλ‘ μμ±ν΄μ€λλ€.
from dataclasses import dataclass
# β
dataclass μ¬μ© (5μ€)
@dataclass
class Person:
name: str
age: int
email: str
# β μΌλ° ν΄λμ€ (15μ€+)
class PersonOld:
def __init__(self, name: str, age: int, email: str):
self.name = name
self.age = age
self.email = email
def __repr__(self):
return f"PersonOld(name={self.name!r}, age={self.age!r}, email={self.email!r})"
def __eq__(self, other):
if not isinstance(other, PersonOld):
return NotImplemented
return (self.name, self.age, self.email) == (other.name, other.age, other.email)from dataclasses import dataclass
@dataclass
class User:
username: str
email: str
age: int
# μΈμ€ν΄μ€ μμ±
user = User("hongildong", "hong@example.com", 30)
print(user)
# User(username='hongildong', email='hong@example.com', age=30)
print(user.username) # "hongildong"
print(user.age) # 30@dataclassλ λ€μ λ©μλλ€μ μλμΌλ‘ μμ±ν©λλ€:
__init__: μμ±μ__repr__: λ¬Έμμ΄ νν__eq__: λλ± λΉκ΅
@dataclass
class Point:
x: int
y: int
p1 = Point(1, 2)
p2 = Point(1, 2)
p3 = Point(3, 4)
# __repr__ μλ μμ±
print(p1) # Point(x=1, y=2)
# __eq__ μλ μμ±
print(p1 == p2) # True
print(p1 == p3) # False@dataclass
class Product:
name: str
price: float
stock: int = 0 # κΈ°λ³Έκ°
category: str = "κΈ°ν" # κΈ°λ³Έκ°
p1 = Product("λ
ΈνΈλΆ", 1200000)
print(p1)
# Product(name='λ
ΈνΈλΆ', price=1200000, stock=0, category='κΈ°ν')
p2 = Product("λ§μ°μ€", 35000, stock=150, category="μ£Όλ³κΈ°κΈ°")
print(p2)
# Product(name='λ§μ°μ€', price=35000, stock=150, category='μ£Όλ³κΈ°κΈ°')# β μ€λ₯ λ°μ
@dataclass
class Wrong:
name: str = "default"
age: int # κΈ°λ³Έκ° μλ νλκ° λ€μ μ€λ©΄ μ λ¨!
# TypeError!
# β
μ¬λ°λ₯Έ μμ
@dataclass
class Correct:
age: int # κΈ°λ³Έκ° μλ νλκ° λ¨Όμ
name: str = "default" # κΈ°λ³Έκ° μλ νλκ° λμ€# β μν! κ°λ³ κ°μ²΄λ₯Ό κΈ°λ³Έκ°μΌλ‘ μ¬μ©νλ©΄ μ λ¨
@dataclass
class Team:
name: str
members: list = [] # ValueError λ°μ!
# ValueError: mutable default <class 'list'> for field members is not allowedfrom dataclasses import dataclass, field
@dataclass
class Team:
name: str
members: list = field(default_factory=list) # λ§€λ² μ 리μ€νΈ μμ±
team1 = Team("κ°λ°ν")
team2 = Team("λμμΈν")
team1.members.append("νκΈΈλ")
team2.members.append("κΉμ² μ")
print(team1.members) # ["νκΈΈλ"]
print(team2.members) # ["κΉμ² μ"] - λ
립μ !from dataclasses import dataclass, field
from typing import Dict, Set
from datetime import datetime
@dataclass
class UserProfile:
username: str
tags: list = field(default_factory=list)
metadata: dict = field(default_factory=dict)
roles: set = field(default_factory=set)
created_at: datetime = field(default_factory=datetime.now)
profile = UserProfile("hong")
print(profile.tags) # []
print(profile.metadata) # {}
print(profile.roles) # set()
print(profile.created_at) # νμ¬ μκ°@dataclass(
init=True, # __init__ μμ± (κΈ°λ³Έ: True)
repr=True, # __repr__ μμ± (κΈ°λ³Έ: True)
eq=True, # __eq__ μμ± (κΈ°λ³Έ: True)
order=False, # __lt__, __le__, __gt__, __ge__ μμ± (κΈ°λ³Έ: False)
frozen=False, # λΆλ³ κ°μ²΄λ‘ λ§λ€κΈ° (κΈ°λ³Έ: False)
unsafe_hash=False # κ°μ λ‘ __hash__ μμ± (μμΈν κ·μΉμ μλ μ°Έκ³ , κΈ°λ³Έ: False)
)
class Example:
value: int
__hash__μλ μμ± κ·μΉ (ν·κ°λ¦¬κΈ° μ¬μ):unsafe_hash=FalseλΌκ³ νμ__hash__μ΄ λΉ μ§λ 건 μλλ€. dataclassλeq/frozenμ‘°ν©μ λ°λΌ λ€μκ³Ό κ°μ΄ λμνλ€:
eqfrozenunsafe_hash__hash__κ²°κ³ΌTrue (κΈ°λ³Έ) True False μλ μμ± β β set/dict ν€ μ¬μ© κ°λ₯ True (κΈ°λ³Έ) False (κΈ°λ³Έ) False NoneμΌλ‘ μ€μ β β hashable μλTrue False True κ°μ μμ± β οΈ β mutableμΈλ° hashκ° μμ΄ μνFalse λ¬΄κ΄ False λΆλͺ¨ ν΄λμ€μ __hash__μμμ¦
unsafe_hash=Trueλ "mutableν dataclassμ κ°μ λ‘ hashλ₯Ό λ§λ€ λ"λ§ μλ―Έκ° μκ³ , μΌλ°μ μΌλ‘λfrozen=Trueλ‘ hashλ₯Ό μ»λ κ²μ΄ μμ νλ€.
@dataclass(frozen=True)
class Point:
x: int
y: int
p = Point(1, 2)
# β κ° λ³κ²½ λΆκ°
try:
p.x = 10
except Exception as e:
print(e) # FrozenInstanceError: cannot assign to field 'x'
# β
dictionary ν€λ‘ μ¬μ© κ°λ₯
points = {Point(1, 2): "origin", Point(3, 4): "other"}
print(points[Point(1, 2)]) # "origin"@dataclass(order=True)
class Student:
name: str
score: int
students = [
Student("νκΈΈλ", 85),
Student("κΉμ² μ", 92),
Student("μ΄μν¬", 78)
]
# νλ μμλλ‘ λΉκ΅ (name -> score)
sorted_students = sorted(students)
for s in sorted_students:
print(s)
# Student(name='κΉμ² μ', score=92)
# Student(name='μ΄μν¬', score=78)
# Student(name='νκΈΈλ', score=85)from dataclasses import dataclass, field
@dataclass
class User:
username: str
email: str
password: str = field(repr=False) # __repr__μμ μ¨κΉ
user = User("hong", "hong@example.com", "secret123")
print(user)
# User(username='hong', email='hong@example.com')
# passwordλ μΆλ ₯ μ λ¨!@dataclass
class Rectangle:
width: float
height: float
area: float = field(init=False) # __init__μ ν¬ν¨ μ ν¨
def __post_init__(self):
self.area = self.width * self.height
rect = Rectangle(10, 5)
# Rectangle(width=10, height=5) ννλ‘λ§ μμ± κ°λ₯
print(rect.area) # 50.0@dataclass
class User:
user_id: int
username: str
last_login: str = field(compare=False) # λΉκ΅ μ 무μ
user1 = User(1, "hong", "2025-01-01")
user2 = User(1, "hong", "2025-01-15")
print(user1 == user2) # True (last_loginμ λΉκ΅ μ ν¨)@dataclass
class Circle:
radius: float
area: float = field(init=False)
circumference: float = field(init=False)
def __post_init__(self):
self.area = 3.14159 * self.radius ** 2
self.circumference = 2 * 3.14159 * self.radius
circle = Circle(5)
print(f"λ°μ§λ¦: {circle.radius}") # λ°μ§λ¦: 5
print(f"λμ΄: {circle.area:.2f}") # λμ΄: 78.54
print(f"λλ : {circle.circumference:.2f}") # λλ : 31.42@dataclass
class User:
username: str
age: int
def __post_init__(self):
if self.age < 0:
raise ValueError("λμ΄λ 0λ³΄λ€ μμ μ μμ΅λλ€")
if len(self.username) < 3:
raise ValueError("μ¬μ©μλͺ
μ μ΅μ 3μ μ΄μμ΄μ΄μΌ ν©λλ€")
# β
μ μ
user1 = User("hongildong", 30)
# β μ€λ₯ λ°μ
try:
user2 = User("ho", 30)
except ValueError as e:
print(e) # μ¬μ©μλͺ
μ μ΅μ 3μ μ΄μμ΄μ΄μΌ ν©λλ€
try:
user3 = User("hong", -5)
except ValueError as e:
print(e) # λμ΄λ 0λ³΄λ€ μμ μ μμ΅λλ€@dataclass
class Product:
name: str
price: float
def __post_init__(self):
# λ¬Έμμ΄λ‘ λ€μ΄μ¨ priceλ₯Ό floatλ‘ λ³ν
if isinstance(self.price, str):
self.price = float(self.price)
p = Product("λ
ΈνΈλΆ", "1200000")
print(p.price) # 1200000.0 (floatλ‘ λ³νλ¨)
print(type(p.price)) # <class 'float'>@dataclass
class Person:
name: str
age: int
@dataclass
class Employee(Person):
employee_id: int
department: str
emp = Employee("νκΈΈλ", 30, 12345, "κ°λ°ν")
print(emp)
# Employee(name='νκΈΈλ', age=30, employee_id=12345, department='κ°λ°ν')# β μ€λ₯ λ°μ
@dataclass
class Parent:
name: str
age: int = 0 # κΈ°λ³Έκ° μμ
@dataclass
class Child(Parent):
student_id: int # κΈ°λ³Έκ° μλ νλκ° λ€μ μ€λ©΄ μ λ¨!
# TypeError!
# β
μ¬λ°λ₯Έ λ°©λ² 1: μμ νλλ λͺ¨λ κΈ°λ³Έκ° λΆμ¬
@dataclass
class ChildCorrect(Parent):
student_id: int = 0 # λΆλͺ¨(Parent.age=0)μ κΈ°λ³Έκ°μ΄ μμΌλ―λ‘ μμ νλλ κΈ°λ³Έκ° νμ
grade: str = "A"
# β
μ¬λ°λ₯Έ λ°©λ² 2: kw_onlyλ‘ μμΉ μΈμ μ μ½ ννΌ (Python 3.10+)
@dataclass(kw_only=True)
class ChildKwOnly(Parent):
student_id: int # ν€μλ μ μ©μ΄λΌ μμΉ μΆ©λ μμ
grade: str = "A"μμ μ ν΅μ¬ κ·μΉ: dataclassλ λΆλͺ¨ β μμ μμλ‘ νλλ₯Ό ν©μ³μ
__init__μ λ§λ€κΈ° λλ¬Έμ, ν©μ³μ§ μκ·Έλμ²μμλ "κΈ°λ³Έκ° μλ μΈμ λ€μ κΈ°λ³Έκ° μλ μΈμ"κ° μ€λ©΄ μ λλ€. Python 3.10+μμλkw_only=Trueλfield(kw_only=True)λ‘ μ΄ μ μ½μ μ°νν μ μλ€.
from dataclasses import dataclass, asdict
@dataclass
class User:
username: str
email: str
age: int
user = User("hong", "hong@example.com", 30)
# λμ
λλ¦¬λ‘ λ³ν
user_dict = asdict(user)
print(user_dict)
# {'username': 'hong', 'email': 'hong@example.com', 'age': 30}
# JSON μ§λ ¬νμ μ μ©
import json
json_str = json.dumps(user_dict)
print(json_str)
# {"username": "hong", "email": "hong@example.com", "age": 30}from dataclasses import astuple
user = User("hong", "hong@example.com", 30)
# ννλ‘ λ³ν
user_tuple = astuple(user)
print(user_tuple)
# ('hong', 'hong@example.com', 30)
# μΈν¨νΉ
username, email, age = astuple(user)
print(username) # hong
print(email) # hong@example.com
print(age) # 30from dataclasses import dataclass, field, asdict
from typing import List, Optional
from datetime import datetime
@dataclass
class Comment:
id: int
author: str
content: str
created_at: datetime = field(default_factory=datetime.now)
@dataclass
class Post:
id: int
title: str
content: str
author: str
tags: List[str] = field(default_factory=list)
comments: List[Comment] = field(default_factory=list)
views: int = 0
created_at: datetime = field(default_factory=datetime.now)
# μ¬μ©
post = Post(
id=1,
title="Python dataclass μμ μ 볡",
content="dataclassλ λ°μ΄ν° ν΄λμ€λ₯Ό μ½κ² λ§λ€μ΄μ€λλ€.",
author="νκΈΈλ",
tags=["python", "tutorial"]
)
post.comments.append(Comment(1, "κΉμ² μ", "μ’μ κΈ κ°μ¬ν©λλ€!"))
post.views += 1
print(post)
# JSONμΌλ‘ λ³ν
post_dict = asdict(post)from dataclasses import dataclass, field
import os
@dataclass
class DatabaseConfig:
host: str = "localhost"
port: int = 5432
username: str = "postgres"
password: str = field(default="", repr=False) # λΉλ°λ²νΈ μ¨κΉ
database: str = "mydb"
@classmethod
def from_env(cls):
"""νκ²½ λ³μμμ μ€μ λ‘λ"""
return cls(
host=os.getenv("DB_HOST", "localhost"),
port=int(os.getenv("DB_PORT", "5432")),
username=os.getenv("DB_USERNAME", "postgres"),
password=os.getenv("DB_PASSWORD", ""),
database=os.getenv("DB_DATABASE", "mydb")
)
def get_connection_string(self):
return f"postgresql://{self.username}:{self.password}@{self.host}:{self.port}/{self.database}"
@dataclass
class AppConfig:
secret_key: str = field(repr=False) # κΈ°λ³Έκ° μλ νλ λ¨Όμ
debug: bool = False
port: int = 8000
database: DatabaseConfig = field(default_factory=DatabaseConfig)
# μ¬μ©
config = AppConfig(
debug=True,
port=8080,
secret_key="my-secret-key",
database=DatabaseConfig.from_env()
)
print(config)
# AppConfig(debug=True, port=8080, database=DatabaseConfig(...))
# secret_keyλ μΆλ ₯ μ λ¨from dataclasses import dataclass, field
from datetime import datetime
from typing import Dict, Any
from enum import Enum
class LogLevel(Enum):
DEBUG = "DEBUG"
INFO = "INFO"
WARNING = "WARNING"
ERROR = "ERROR"
@dataclass
class LogEntry:
message: str
level: LogLevel = LogLevel.INFO
timestamp: datetime = field(default_factory=datetime.now)
context: Dict[str, Any] = field(default_factory=dict)
def __str__(self):
ctx = ", ".join(f"{k}={v}" for k, v in self.context.items())
return f"[{self.timestamp:%Y-%m-%d %H:%M:%S}] {self.level.value}: {self.message} | {ctx}"
# μ¬μ©
log = LogEntry(
message="User login successful",
level=LogLevel.INFO,
context={"user_id": 123, "ip": "192.168.1.1"}
)
print(log)
# [2025-01-13 14:30:45] INFO: User login successful | user_id=123, ip=192.168.1.1from dataclasses import dataclass, field
from datetime import datetime
from typing import Optional
@dataclass
class CreateUserRequest:
"""μ¬μ©μ μμ± μμ² DTO"""
username: str
email: str
password: str = field(repr=False)
age: Optional[int] = None
def __post_init__(self):
# μ ν¨μ± κ²μ¦
if not self.username or len(self.username) < 3:
raise ValueError("μ¬μ©μλͺ
μ 3μ μ΄μμ΄μ΄μΌ ν©λλ€")
if "@" not in self.email:
raise ValueError("μ¬λ°λ₯Έ μ΄λ©μΌ νμμ΄ μλλλ€")
if len(self.password) < 8:
raise ValueError("λΉλ°λ²νΈλ 8μ μ΄μμ΄μ΄μΌ ν©λλ€")
if self.age is not None and self.age < 0:
raise ValueError("λμ΄λ 0 μ΄μμ΄μ΄μΌ ν©λλ€")
@dataclass
class UserResponse:
"""μ¬μ©μ μλ΅ DTO"""
id: int
username: str
email: str
age: Optional[int] = None
created_at: datetime = field(default_factory=datetime.now)
# passwordλ μλ΅μ ν¬ν¨νμ§ μμ
# μ¬μ©
request = CreateUserRequest(
username="hongildong",
email="hong@example.com",
password="secret123456",
age=30
)
# μλΉμ€ κ³μΈ΅μμ μ²λ¦¬ ν
response = UserResponse(
id=1,
username=request.username,
email=request.email,
age=request.age
)
print(response)
# UserResponse(id=1, username='hongildong', email='hong@example.com', age=30, created_at=...)| νΉμ§ | μΌλ° ν΄λμ€ | dataclass | NamedTuple |
|---|---|---|---|
| κ°κ²°ν¨ | β 보μΌλ¬νλ μ΄νΈ λ§μ | β κ°κ²° | β λ§€μ° κ°κ²° |
| κ°λ³μ± | β κ°λ³ | β κ°λ³ (frozen=False) | β λΆλ³ |
| λ©μλ μΆκ° | β μμ λ‘κ² | β μμ λ‘κ² | β κ°λ₯ |
| μμ | β μμ λ‘κ² | β κ°λ₯ | |
| κΈ°λ³Έκ° | β μ€μ κ°λ₯ | β μ€μ κ°λ₯ | β μ€μ κ°λ₯ |
| νμ ννΈ | β νμ | β νμ | |
| dict ν€ μ¬μ© | β
κΈ°λ³Έ κ°λ₯ (λ¨ __eq__λ§ μ¬μ μνλ©΄ __hash__=None λμ΄ λΆκ°) |
frozen=True νμ (κΈ°λ³Έ dataclassλ __eq__ μλ μμ±μΌλ‘ hash λΉνμ±ν) |
list/dict κ°μ κ°λ³ κ°μ λ΄μΌλ©΄ unhashable) |
from dataclasses import dataclass
from typing import NamedTuple
# 1. μΌλ° ν΄λμ€ (κ°μ₯ μ μ°)
class PersonClass:
def __init__(self, name: str, age: int):
self.name = name
self.age = age
def __repr__(self):
return f"PersonClass(name={self.name!r}, age={self.age!r})"
def __eq__(self, other):
if not isinstance(other, PersonClass):
return NotImplemented
return (self.name, self.age) == (other.name, other.age)
def greet(self):
return f"μλ
νμΈμ, {self.name}μ
λλ€"
# 2. dataclass (μ€κ°)
@dataclass
class PersonDataclass:
name: str
age: int
def greet(self):
return f"μλ
νμΈμ, {self.name}μ
λλ€"
# 3. NamedTuple (λΆλ³)
class PersonTuple(NamedTuple):
name: str
age: int
def greet(self):
return f"μλ
νμΈμ, {self.name}μ
λλ€"# β
λΆλ³ λ°μ΄ν° + κ°λ¨ν ꡬ쑰 β NamedTuple
class Point(NamedTuple):
x: int
y: int
# β
λ°μ΄ν° μ€μ¬ + κ°κ²°ν¨ νμ β dataclass
@dataclass
class User:
username: str
email: str
age: int
# β
볡μ‘ν λ‘μ§ + λ§μ λ©μλ β μΌλ° ν΄λμ€
class UserService:
def __init__(self, db_connection):
self.db = db_connection
def authenticate(self, username, password):
# 볡μ‘ν μΈμ¦ λ‘μ§
pass
def get_user(self, user_id):
# DB μ‘°ν λ‘μ§
pass# β νμ
ννΈ μμΌλ©΄ dataclass νλλ‘ μΈμ μ λ¨
@dataclass
class Wrong:
name = "default" # ν΄λμ€ λ³μλ‘ μΈμλ¨ (dataclass νλ μλ!)
# β
νμ
ννΈ νμ
@dataclass
class Correct:
name: str = "default" # dataclass νλ# β μ λ μ λ¨
@dataclass
class Wrong:
items: list = [] # ValueError!
# β
field(default_factory) μ¬μ©
@dataclass
class Correct:
items: list = field(default_factory=list)# λ©λͺ¨λ¦¬ μ΅μ ν
@dataclass(slots=True)
class Point:
x: int
y: int
# μ₯μ :
# - λ μ μ λ©λͺ¨λ¦¬ μ¬μ©
# - μμ± μ κ·Ό μλ ν₯μ
# λ¨μ :
# - __dict__κ° μμ΄μ λμ μμ± μΆκ° λΆκ°# ν€μλ μ μ© μΈμλ‘ κ°μ
@dataclass(kw_only=True)
class Config:
host: str
port: int
# β μμΉ μΈμ λΆκ°
# config = Config("localhost", 8080) # TypeError!
# β
ν€μλ μΈμλ§ κ°λ₯
config = Config(host="localhost", port=8080)@dataclass
class Address:
street: str
city: str
zipcode: str
@dataclass
class Person:
name: str
age: int
address: Address
person = Person(
name="νκΈΈλ",
age=30,
address=Address("κ°λ¨λλ‘ 123", "μμΈ", "06000")
)
print(person)
# Person(name='νκΈΈλ', age=30, address=Address(street='κ°λ¨λλ‘ 123', city='μμΈ', zipcode='06000'))
# asdictλ‘ μ€μ²© λ³ν
from dataclasses import asdict
print(asdict(person))
# {'name': 'νκΈΈλ', 'age': 30, 'address': {'street': 'κ°λ¨λλ‘ 123', 'city': 'μμΈ', 'zipcode': '06000'}}from dataclasses import dataclass
from typing import Dict, Any
@dataclass
class User:
id: int
username: str
email: str
@classmethod
def from_dict(cls, data: Dict[str, Any]) -> 'User':
"""λμ
λ리μμ User μμ±"""
return cls(
id=data['id'],
username=data['username'],
email=data['email']
)
@classmethod
def from_json(cls, json_str: str) -> 'User':
"""JSON λ¬Έμμ΄μμ User μμ±"""
import json
data = json.loads(json_str)
return cls.from_dict(data)
# μ¬μ©
user_data = {"id": 1, "username": "hong", "email": "hong@example.com"}
user = User.from_dict(user_data)
json_str = '{"id": 2, "username": "kim", "email": "kim@example.com"}'
user2 = User.from_json(json_str)λ°μ΄ν°λ₯Ό μ μ₯νλ ν΄λμ€λ₯Ό κ°νΈνκ² λ§λ€μ΄μ£Όλ λ°μ½λ μ΄ν°λ‘, 보μΌλ¬νλ μ΄νΈ μ½λλ₯Ό μλ μμ±ν©λλ€.
from dataclasses import dataclass, field
@dataclass(frozen=True, order=True)
class Person:
name: str
age: int = 0
tags: list = field(default_factory=list, repr=False)
def __post_init__(self):
if self.age < 0:
raise ValueError("λμ΄λ 0 μ΄μμ΄μ΄μΌ ν©λλ€")__init__: μμ±μ__repr__: λ¬Έμμ΄ νν__eq__: λλ± λΉκ΅__hash__: ν΄μ (frozen=True μΌ λ)__lt__,__le__,__gt__,__ge__: μμ λΉκ΅ (order=True μΌ λ)
| μ΅μ | μ€λͺ | κΈ°λ³Έκ° |
|---|---|---|
init |
__init__ μμ± |
True |
repr |
__repr__ μμ± |
True |
eq |
__eq__ μμ± |
True |
order |
λΉκ΅ λ©μλ μμ± | False |
frozen |
λΆλ³ κ°μ²΄ | False |
slots |
__slots__ μ¬μ© (3.10+) |
False |
kw_only |
ν€μλ μ μ© μΈμ (3.10+) | False |
β μ¬μ©νκΈ° μ’μ κ²½μ°:
- λ°μ΄ν°λ₯Ό μ μ₯νλ κ°λ¨ν ν΄λμ€
- μ€μ κ°μ²΄, λͺ¨λΈ, DTO (Data Transfer Object)
- API μλ΅/μμ² λͺ¨λΈ
- 보μΌλ¬νλ μ΄νΈ μ½λ μ€μ΄κΈ°
β μ¬μ©νμ§ μλ κ²μ΄ μ’μ κ²½μ°:
- 볡μ‘ν λΉμ¦λμ€ λ‘μ§μ΄ λ§μ ν΄λμ€
- λ§μ λ©μλμ μν κ΄λ¦¬κ° νμν κ²½μ°
- μμ κ΅¬μ‘°κ° λ³΅μ‘ν κ²½μ°
from dataclasses import dataclass, field
@dataclass
class Example:
# νμ νλ (κΈ°λ³Έκ° μμ β λ°λμ λ¨Όμ )
required_field: str
# κΈ°λ³Έκ°
optional_field: int = 0
# κ°λ³ κΈ°λ³Έκ°
items: list = field(default_factory=list)
# __repr__μμ μ¨κΉ β κΈ°λ³Έκ° μλ νλ μ¬μ΄μ λλ €λ©΄ defaultλ ν¨κ»
secret: str = field(default="", repr=False)
# μ΄κΈ°νμμ μ μΈ
computed: float = field(init=False)
# λΉκ΅μμ μ μΈ
metadata: dict = field(default_factory=dict, compare=False)
def __post_init__(self):
# μ΄κΈ°ν ν μ²λ¦¬
self.computed = self.required_field * self.optional_field