Python 데이터 클래스를 시작하기 위해 알아야 할 6 가지

커스텀 클래스에서 일부 상용구 코드 제거

Unsplash에 Philipp Katzenberger의 사진

데이터는 모든 프로그래밍 프로젝트에서 가장 필수적인 요소입니다. 모든 프로그램은 데이터와 특정 상호 작용을해야합니다. 예를 들어, 프로젝트가 웹 사이트 인 경우 사용자 친화적 인 방식으로 데이터 (예 : 텍스트 및 이미지)를 제시해야합니다. 프로젝트에서 기계 학습을 사용하여 재무 추세를 예측하는 경우 모델에서 학습 할 수있는 데이터를 준비해야합니다.

범용 프로그래밍 언어 인 Python은 프로젝트의 데이터 관리를 지원하는 다용도 도구 배터리를 갖도록 진화했습니다. 이러한 도구 중 데이터 클래스는 유용하지만 이해하기 쉬운 기술입니다. 이 기사에서는이 데이터 관리 도구를 시작할 수있는 주요 하이라이트와 함께 데이터 클래스 모델을 소개하고자합니다.

1. 데이터 클래스 정의

데이터 클래스 관련 기능은 dataclasses표준 Python 라이브러리의 일부인 모듈에 정의되어 있습니다. 이 모듈의 가장 중요한 요소는 dataclass데코레이터입니다. 다음 코드는 dataclass레스토랑에서 청구서를 관리하기 위해 정의한 커스텀 클래스에 데코레이터를 사용하는 방법을 보여줍니다 .

특히 dataclass데코레이터를 사용하여 정의중인 사용자 지정 클래스를 장식합니다. 정의 된 클래스에서 클래스에 속하는 속성 (데이터 클래스의 필드라고 함)을 지정합니다.

왜 우리가 dataclass데코레이터를 사용하는지 물어볼 수 있습니다 . 이 장식은 우리와 같은 일부 boilerplates의 제거 얻을 수 있습니다 때문입니다 __init____repr__. 즉, 커스텀 클래스에이 데코레이터를 사용하면 이러한 함수를 구현할 필요가 없습니다. 대신 아래에 표시된 것처럼 데코레이터가 처리해줍니다.

위에 표시된대로 초기화 및 표현 방법을 명시 적으로 정의하지 않고 둘 다 관용적으로 구현됩니다. 멋지지 않나요?

2. 유형 주석 및 기본 필드 값

위에 표시된 데이터 클래스에서 모든 필드에는 유형을 명확하게 나타내는 유형 주석이 있습니다. 결국, 데이터 클래스는 대부분 데이터를 처리하도록 개발되었으며 데이터 클래스가 보유하는 데이터 유형에 대해 명시 적이라는 것이 이치에 맞습니다.

기계적으로 말하면 데이터 클래스의 필드에는 유형 주석이 필요합니다. 그렇지 않으면 코드를 실행할 수 없습니다. 내부적으로 dataclass데코레이터는 __annotations__특수 메서드를 사용하여 검색 할 수있는 클래스의 주석을 기반으로 필드를 생성합니다 .

>>> Bill.__annotations__
{'table_number': <class 'int'>, 'meal_amount': <class 'float'>, 'served_by': <class 'str'>, 'tip_amount': <class 'float'>}

@dataclass
... class SpecialBill:
...     table_number: int = 888
...     meal_amount: float
...     served_by: str
...     tip_amount: float = 0.0
... 
Traceback (most recent call last):
  ...some traceback info omitted
TypeError: non-default argument 'meal_amount' follows default argument

초기화 및 표현 방법 외에도 dataclass데코레이터는 비교 관련 기능을 구현합니다. 일반 사용자 정의 클래스의 경우 비교 동작을 정의하지 않으면 인스턴스간에 의미있는 비교를 할 수 없습니다. dataclass데코레이터를 사용하지 않는 다음 사용자 정의 클래스를 고려하십시오 .

위에 표시된대로 일반 클래스의 경우 모든 속성에 대해 동일한 값을 가진 두 인스턴스는 기본적으로 ID로 비교되기 때문에 같지 않은 것으로 평가됩니다. 이 경우이 두 인스턴스는 별개의 두 개체이며 같지 않은 것으로 간주됩니다.

그러나 데이터 클래스를 사용하면 이러한 동등성 비교는 True. dataclass데코레이터가 자동으로 __eq__우리를 위해 특별한 방법을 생성 하기 때문 입니다. 특히, 각 인스턴스가 정의 된 순서대로 필드를 포함하는 튜플 인 것처럼 같음 비교가 수행됩니다. 두 데이터 클래스 인스턴스에는 동일한 값의 필드가 있으므로 동일한 것으로 간주됩니다.

보다 큼 및보다 작음과 같은 불평등 비교는 어떻습니까? 아래 라인 1에 표시된대로 데코레이터에 dataclass대한 order매개 변수를 지정 하여 데코레이터로 도 가능합니다 .

같음 비교와 유사하게 데이터 클래스 인스턴스는 이러한 필드의 튜플 인 것처럼 비교되고 사전 순으로 튜플로 비교됩니다. 개념 증명을 위해 위 코드에는 두 개의 필드 만 포함되어 있으며, 보시다시피 비교 결과는 튜플의 순서를 기반으로합니다.

4. 가변성 고려

기본적으로 데이터 클래스의 필드는 수정 될 수 있으므로 데이터 클래스 인스턴스는 변경 가능하다고 말할 수 있습니다. 이것이 일부 사람들이 데이터 클래스를 가변 명명 된 튜플이라고 부르는 이유 입니다. 변경 가능성과 관련하여 명명 된 튜플과 데이터 클래스 간의 다음과 같은 대조를 고려하십시오.

위와 같이 명명 된 튜플의 속성을 설정할 수 없습니다. 그러나 데이터 클래스 인스턴스를 사용하여이를 수행 할 수 있으며, 이는 데이터 클래스의 가변성을 지원하는 이점을 강조합니다.

그러나 데이터 가변성이 항상 바람직한 것은 아닙니다. 어떤 경우에는 데이터가 변경되지 않기를 원합니다. 이러한 시나리오에서는 데코레이터 를 사용할 때 frozen매개 변수를 지정하는 것을 고려할 수 있습니다 . 아래에 간단한 예가 나와 있습니다.Truedataclass

5. 상속 고려 사항

핵심적으로 데이터 클래스는 다른 일반 사용자 지정 클래스와 동일한 확장 성을 갖습니다. 따라서 필요한 경우 데이터 클래스를 하위 클래스로 만들 수 있습니다.

위의 코드 스 니펫에서 볼 수 있듯이 dataclass데코레이터는 하위 클래스에 대한 기본 클래스의 필드를 고려합니다. 즉, 하위 클래스의 초기화에서 볼 수 있듯이 기본 클래스와 하위 클래스 자체의 필드 서명이 자동으로 포함됩니다. 특히 순서는 정의 순서를 기반으로합니다. 여러 세대의 서브 클래 싱이있는 경우 기본 클래스의 필드가 먼저 이동하고 서브 클래스의 필드가 다음으로 이동하는 식입니다.

하위 클래스에서 이러한 필드의 순서와 기본값이있는 데이터 클래스의 필드가 기본값이없는 필드보다 우선해야한다는 요구 사항으로 인해 기본 클래스에 기본값이있는 필드가있는 경우 하위 클래스의 추가 된 필드에 기본값이 있어야한다는 의미입니다. 가치도 있습니다. 그렇지 않으면 이전에 본 것과 동일한 오류가 표시 될 수 있습니다.

@dataclass
... class BaseBill:
...     meal_amount: float = 20
... 
@dataclass
... class TippedBill(BaseBill):
...     tip_amount: float
... 
Traceback (most recent call last):
  ... some traceback info omitted
TypeError: non-default argument 'tip_amount' follows default argument

위의 예에서 필드는 부동 소수점 및 문자열과 같은 모두 변경할 수없는 데이터 유형입니다. 데이터 클래스의 필드로 변경 가능한 데이터를 사용해야하는 경우 어떻게해야합니까? Python 프로그래머가 할 수있는 몇 가지 실수와 관련된 다음 코드 스 니펫을 고려하십시오.

위의 코드는 함수가 변경 가능한 기본값을 사용하는 경우 매개 변수를 지정하지 않은 모든 호출자가이 객체를 공유하므로 변경 가능한 인스턴스를 사용하여 기본값을 설정할 수 없음을 보여줍니다. 위의 예에서 볼 수 있듯이 두 인스턴스는 동일한 기본 목록 개체를 공유하므로 원하지 않는 부작용이 발생합니다.

데이터 클래스의 컨텍스트 내에서 질문은 변경 가능한 필드에 대한 기본값을 지정하는 방법입니다. 다음을 수행해서는 안되며 ValueError예외가 발생합니다.

@dataclass
class IncorrectBill:
    costs_by_dish: list = []
ValueError: mutable default <class 'list'> for field costs_by_dish is not allowed: use default_factory

  • 모듈 에서 field함수를 가져옵니다 dataclasses.
  • 에서 field기능, 우리는 지정 listdefault_factory매개 변수입니다. 본질적으로이 매개 변수는 인스턴스가 생성 될 때 사용할 매개 변수가 0 인 함수 인 기본 팩토리 함수를 설정합니다. 이 경우 list함수는를 호출 할 때 새 목록 객체를 생성하는 목록 객체의 생성 메서드입니다 list().
  • 보시다시피 두 경우 모두 costs_by_dish예상대로 속성에 대한 고유 한 목록 개체가 있습니다.

이 기사에서는 Python에서 데이터 클래스를 시작하기 위해 알아야 할 가장 기본적인 6 가지 요소를 검토했습니다. 본질적으로 그들은 데이터를 저장하는 데 매우 유용하며 dataclass데코레이터는 우리를 위해 많은 상용구를 처리합니다. 명명 된 튜플에 비해 가변성을 허용하여 더 유연합니다.

Suggested posts

N + 1 문제 선택

모든 것은 비용이 있습니다.

N + 1 문제 선택

개발자의 경우 ORM (Object-relational mapping)을 사용하면 삶을 상당히 단순화 할 수 있지만 알아야 할 자체 캐치 세트가 있습니다. 더 심각한 문제 중 하나는 Select N + 1 문제입니다.

정규식을 사용한 문자열의 패턴 일치.

정규식을 사용한 문자열의 패턴 일치.

정규식 또는 정규식은 축약 된 형식 언어로 작성됩니다. 일반적으로 정규식은 소스 데이터가있는 정규식 프로세서에 제공하는 패턴으로 생각할 수 있습니다.

Related posts

"실용적인 프로그래머"의 5 가지 필수 사항

역대 베스트셀러 코딩 북의 요점

"실용적인 프로그래머"의 5 가지 필수 사항

Pragmatic Programmer는 1999 년에 처음 출판되었으며 이후 역대 최고의 프로그래밍 책으로 선정되었습니다. 저자 Andy Hunt와 David Thomas는 Agile Manifesto의 원저자 중 하나였으며 몇 가지 심각한 자격을 가지고 있습니다.

대규모 GraphQL 쿼리 공격으로부터 보호

공격자가 공개적으로 사용 가능한 GraphQL 인터페이스를 사용하여 사이트를 스크랩하거나 서비스 거부 공격을 실행하는 방법에 대해 알아보십시오. 이들은 4 가지 방법 중 하나로이를 수행 할 수 있습니다. 단일 대형 쿼리를 신중하게 구성하여 실행하고, 관련 데이터를 가져올 수있는 병렬 쿼리를 많이 작성하고, 일괄 요청을 사용하여 많은 쿼리를 연속적으로 실행하고, 마지막으로 많은 요청을 보냅니다.

기술 인터뷰의 사회적 구성 요소

코딩 문제는 스트레스가 많지만 스트레스에 대한 당신의 반응은 당신의 기술적 능력보다 더 크게 말합니다.

기술 인터뷰의 사회적 구성 요소

기술 업계의 직책을 위해 인터뷰 할 때 일반적으로 제안을 고려하기 전에 최소한 3 차례의 인터뷰를 거치게됩니다. 라운드는 일반적으로 다음과 같습니다. 그렇게 생각하면 잘못된 것입니다.

훌륭한 개발자의 3 가지 행동 특성

훌륭한 개발자의 3 가지 행동 특성

훌륭한 개발자를 만드는 비 기술적 인 것들 나는이 기사를 작성하는 것을 한동안 미루고 있습니다. 나는 그것을 작성할 자격이 있다고 생각하지 못했습니다. 오늘은 쓸 때라고 생각했습니다.