Python의 구조
파이썬은 객체 지향 프로그래밍 언어로 클래스와 객체가 있습니다. 반면 C는 객체 지향 프로그래밍 언어가 아니므로 이를 사용하여 기능적 프로그래밍만 수행할 수 있습니다. 그러나 C에는 사용자 정의 데이터 유형인 구조가 있습니다.
Python에는 구조가 없지만 다른 객체, 즉 데이터 클래스를 사용하여 구조를 구현하거나 동작을 나타낼 수 있습니다. 데이터 클래스는 필드와 이러한 필드를 조작하기 위한 CRUD 메서드(getter 및 setter)만 포함하는 클래스입니다. 이러한 클래스의 주요 목적은 데이터를 저장하거나 패키지 형태로 일부 데이터를 나타내는 것입니다. 데이터 클래스는 엔터티를 나타내며 엔터티에는 여러 매개 변수 또는 속성이 있으므로 데이터 클래스를 사용하면 모든 것을 단일 개체 아래에 더 쉽게 패키징할 수 있습니다.
이 기사에서는 Python에서 데이터 클래스를 사용하는 방법을 배웁니다.
Python의 데이터 클래스
Python 3.7은 데이터 클래스를 도입했습니다. 데이터 클래스는 기본 Python 클래스를 사용하여 구현할 수 있지만 데이터 클래스는 장면 뒤에서 필요한 대부분의 기능을 구현하므로 데이터 클래스에 대한 Python 코드를 더 짧고 읽기 쉽게 만듭니다. 원시 Python 클래스를 사용하여 구현하면 더 많은 제어가 가능하지만 더 큰 데이터 클래스의 경우 구현이 지저분하고 방대해져 관리할 수 없게 될 수 있습니다.
파이썬에는 dataclasses
모듈 내부에 정의된 데코레이터 dataclass
가 있습니다. 이 데코레이터는 __init__()
, __repr__()
등과 같은 데이터 클래스 내부에 필요한 특수 메서드를 자동으로 추가합니다.
다음은 예입니다.
from dataclasses import dataclass
@dataclass
class Item:
name: str
price: float
quantity: int
def total_cost(self) -> float:
return self.price * self.quantity
위에서 언급했듯이 @dataclass
데코레이터는 특수 메소드를 자동으로 추가합니다. 즉, 다음 __init__()
메서드가 자동으로 추가됩니다.
def __init__(self, name: str, price: float, quantity: int = 0):
self.name = name
self.price = price
self.quantity = quantity
또한 이 데이터 클래스는 Item
유형의 개체를 만드는 데 사용할 수 있으며 이러한 개체는 일반 클래스 개체처럼 취급할 수 있습니다.
from dataclasses import dataclass
@dataclass
class Item:
name: str
price: float
quantity: int
def total_cost(self):
return self.price * self.quantity
a = Item("Chocolate", 25, 100)
b = Item("Chips", 35, 150)
c = Item("Cookie", 10, 50)
print(a)
print(b)
print(c)
print(a.total_cost())
print(b.total_cost())
print(c.total_cost())
dataclass
데코레이터에는 다음과 같은 몇 가지 매개변수가 있습니다.
init
- 기본적으로True
.True
이면 데이터 클래스의__init__()
메서드가 정의됩니다.repr
- 기본적으로True
.True
인 경우 데이터 클래스의__repr__()
메서드가 정의됩니다.eq
- 기본적으로True
.True
인 경우 데이터 클래스의__eq__()
메서드가 정의됩니다.order
- 기본적으로False
.True
이면 데이터 클래스의__lt__()
,__le__()
,__gt__()
및__ge__()
메서드가 정의됩니다.unsafe_hash
- 기본적으로False
.False
인 경우 데이터 클래스의__hash__()
메서드가 정의됩니다.frozen
- 기본적으로False
.True
인 경우 데이터 클래스 속성이 고정됩니다. 즉, 초기화되면 더 이상 조작할 수 없습니다.match_args
- 기본적으로True
.kw_only
- 기본적으로False
.True
이면 데이터 클래스의 모든 필드가 키워드 전용으로 표시됩니다.slots
- 기본적으로False
.
이러한 매개변수는 클래스 구현 위에 dataclass
데코레이터를 배치할 때 구성할 수 있습니다. 다음과 같은 몇 가지 예가 있습니다.
@dataclass
class A:
pass
@dataclass(init=True, repr=True, order=True)
class B:
pass
@dataclass(
eq=True,
order=False,
unsafe_hash=True,
)
class C:
pass
dataclasses
모듈에 대한 자세한 내용은 여기 공식 문서를 참조하십시오.