본문 바로가기
Coding

Python의 일반 사용자 정의 클래스에 대한 3가지 대안

by Jake Gyllenhaal 2022. 4. 5.
반응형

Python의 일반 사용자 정의 클래스에 대한 3가지 대안

 

사진 제공: Headway on Unsplash

모든 프로젝트에서 대부분의 경우 데이터를 모델링하기 위해 다양한 클래스를 정의하기 위해 노력하고 있습니다. 따라서 적절한 클래스를 구축하는 것은 프로젝트를 견고하고 유지 관리할 수 있도록 만드는 필수 기술입니다. 일반적으로 사용자 정의 클래스는 다음과 같은 형식을 취합니다.

class CustomClass
# the body of the class
pass

그러나 다른 것을 사용하려는 몇 가지 상황이 있습니다. 이 기사에서는 프로젝트의 클래스 정의와 관련된 세 가지 대안을 검토하겠습니다.

우리는 튜플이 파이썬의 기본 내장 데이터 구조 중 하나라는 것을 알고 있습니다. 튜플을 정의할 때 아래와 같이 단순히 괄호를 사용하여 항목을 쉼표로 구분하여 묶습니다.

student_data = ("John", "M")

기본 제공 유형인 튜플은 일반 용도로 사용할 수 있도록 제네릭으로 설계되었습니다. 그러나 이러한 일반성은 비용이 듭니다. 튜플은 그들이 보유하고 있는 데이터가 무엇인지 모릅니다. 튜플의 경우 우리가 "정의"하지 않으며 제한 없이 원하는 대로 모든 항목을 보유할 수 있습니다. 대조적으로 사용자 정의 클래스는 어떤 데이터, 특히 속성이 보유하고 있는지 알고 있습니다.

자동 완성 힌트

위와 같이 PyCharm IDE에서 볼 수 있습니다. studentIDE가 어떤 데이터를 알고 있기 때문에 의 속성은 코드 완성을 위해 자동으로 채워집니다. student 가질 수 있습니다.

"일반" 클래스의 이점(예: 점 표기법)을 제공하기 위해 명명된 튜플이라는 튜플을 기반으로 하는 데이터 모델을 실제로 만들 수 있습니다.

명명된 튜플

명명된 튜플을 만들려면 다음을 가져옵니다. namedtuple 내장 함수 collections 기준 치수. 그만큼 namedtuple 함수는 새 클래스를 만드는 데 사용하기 때문에 팩토리 함수라고 할 수 있습니다. 특히 클래스 이름을 문자열로 제공하고 속성을 목록으로 제공합니다. 명명된 튜플의 경우 해당 인스턴스가 보유하고 있는 데이터를 알고 있습니다.

의문: 언제 일반 사용자 정의 클래스보다 명명된 튜플을 사용하시겠습니까?

답변: 데이터 모델이 데이터 컨테이너 역할을 할 때 명명된 튜플을 사용할 수 있습니다. 명명된 튜플은 가변성을 지원하지 않기 때문입니다. 즉, 일반 클래스의 인스턴스와 달리 명명된 튜플 인스턴스의 속성을 변경할 수 없습니다. 특히, 명명된 튜플은 튜플의 하위 클래스이므로 크기가 작습니다. 많은 인스턴스를 생성해야 하는 경우 명명된 튜플이 메모리를 절약합니다.

명명된 튜플에 대한 자세한 내용은 이전 기사를 참조하십시오.

열거는 동일한 개념의 관련 구성원을 함께 보유하는 클래스를 만드는 것과 관련된 기술입니다. 예를 들어, 북쪽, 남쪽, 동쪽 및 서쪽은 방향 개념의 구성원입니다. 다른 예로 봄, 여름, 가을, 겨울이 시즌 개념의 구성원입니다.

Python의 표준 라이브러리에서 enum 모듈은 열거형 클래스를 생성하기 위한 필수 기능을 제공합니다. 먼저 몇 가지 코드를 살펴보겠습니다.

from enum import Enum

class Season(Enum):
SPRING = 1
SUMMER = 2
FALL = 3
WINTER = 4

보시다시피 Season 클래스는 사계절을 담고 있는 Enum의 서브클래스입니다. 여기서는 상수를 나타내므로 이 4개의 멤버를 대문자로 표시합니다. 그러나 소문자를 선호하는 경우 선택합니다. 각 구성원에는 두 가지 중요한 속성이 있습니다. name 그리고 value아래 그림과 같이:

>>> spring = Season.SPRING
>>> spring.name
'SPRING'
>>> spring.value
1

값의 경우 이름을 증분 정수로 지정할 수 있습니다. 열거형 멤버를 구성하려는 경우 유용할 수 있습니다. API가 있고 시즌 값으로 2의 응답을 수신한다고 가정합니다. 아래와 같이 회원을 생성할 수 있습니다.

>>> fetched_season_value = 2
>>> matched_season = Season(fetched_season_value)
>>> matched_season

열거형 클래스의 또 다른 유용한 기능은 반복 지원입니다. 즉, 열거형 클래스는 반복 가능합니다. 예를 들어 아래를 실행하여 이러한 열거 번호 목록을 만들 수 있습니다.

>>> list(Season)
[, , , ]

다음 4계절의 이름을 얻으려면 목록 이해를 사용할 수도 있습니다.

>>> [x.name for x in Season]
['SPRING', 'SUMMER', 'FALL', 'WINTER']

의문: 일반 사용자 정의 클래스에 대해 열거를 언제 사용하고 싶습니까?

답변: 같은 개념에 속하는 구성원의 그룹이 있는 경우 열거를 사용해야 합니다. 일반 클래스를 만들고 클래스 속성을 사용하여 이러한 멤버를 보유할 수 있지만 일반 클래스는 기본적으로 반복을 지원하지 않습니다. 또한 이러한 멤버를 조작하기 위한 이름 및 값과 같은 기본 특성이 없습니다.

열거에 대한 자세한 내용은 이전 기사를 참조하십시오.

내가 데이터 클래스를 말할 때, 나는 단순히 우리가 dataclass 장식가. 함수를 꾸미는 일반적인 데코레이터와 달리 dataclass 데코레이터는 아래와 같이 클래스를 장식합니다.

from dataclasses import dataclass

@dataclass
class Student:
name: str
gender: str

그만큼 dataclass 데코레이터는 dataclasses 기준 치수. 정의하는 클래스 위에 이 데코레이터를 배치하기만 하면 됩니다. 클래스 본문에서 해당 유형과 함께 클래스의 속성을 지정합니다.

장식은 매우 간단해 보입니다. 이러한 추가 기능이 dataclass 장식가.

>>> student = Student("John", "M")
>>> student.name
'John'
>>> student.gender
'M'

위에 표시된 한 가지 중요한 점은 명시적으로 정의하지 않았다는 것입니다. __init__ 메서드이지만 장식된 Student 클래스는 인스턴스를 구성하는 방법을 알고 있습니다! 그 이유는 dataclass 데코레이터는 주석이 달린 속성을 사용합니다(예: name: str & gender: str) 초기화 생성 __init__ 우리를 위한 방법입니다.

게다가 __init__ 방법, dataclass 데코레이터도 구현합니다 __repr__ 인스턴스를 검사할 수 있는 메서드:

>>> repr(student)
"Student(name='John', gender='M')"

특히, 왜냐하면 __repr__ 클래스가 구현하지 않는 경우의 대체입니다. __str__. 따라서 데이터 클래스의 인스턴스를 인쇄하면 동일한 문자열 출력을 얻을 수 있습니다.

>>> print(student)
Student(name='John', gender='M')

의문: 언제 일반 사용자 정의 클래스보다 데이터 클래스를 사용하고 싶습니까?

답변: __init__ 및 __repr__ 구현과 같이 사용자 정의 클래스에 대한 일부 상용구를 제거하려는 경우. __init__ 메서드에서 더 많은 사용자 정의 동작을 원하면 데이터 클래스 데코레이터가 최선의 선택이 아닐 수 있습니다.

열거에 대한 자세한 내용은 이전 기사를 참조하십시오.

이 기사에서는 일반 사용자 정의 클래스 외에 고려할 수 있는 세 가지 대안인 명명된 튜플, 열거 및 데이터 클래스를 검토했습니다. 각각 장단점이 있으므로 필요에 따라 적절한 데이터 모델을 선택해야 합니다. 일반 사용자 정의 클래스로 자신을 제한하지 마십시오. 더 나은 내장 솔루션이 있을 수 있습니다.

바퀴를 재발명하지 않는다는 것을 기억하십시오!

반응형

댓글