데이터 클래스는 무엇이며 일반 클래스와 어떻게 다릅니까?
PEP 557을 사용하면 데이터 클래스가 python 표준 라이브러리에 도입됩니다.
은 이 말을 합니다.@dataclass데코레이터와 디폴트로는 변이할 수 있는 이름 있는 튜플이지만, 이것이 실제로 무엇을 의미하는지, 그리고 그것들이 일반 클래스와 어떻게 다른지 잘 모르겠습니다.
파이썬 데이터 클래스는 정확히 무엇이며 언제 사용하는 것이 가장 좋은가?
데이터 클래스는 많은 논리를 포함하는 것이 아니라 상태를 저장하는 데 적합한 일반 클래스입니다.대부분 속성으로 구성된 클래스를 만들 때마다 데이터 클래스를 만듭니다.
,, … ...dataclasses모듈에서는 데이터 클래스를 쉽게 만들 수 있습니다.보일러 플레이트를 많이 관리해 줍니다.
은 데이터 가능해야 하는 에 특히 이 " " "가 입니다.__hash__ 및 __eq__★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」__repr__디버깅을 쉽게 할 수 있는 방법, 즉 매우 상세하게 할 수 있습니다.
class InventoryItem:
'''Class for keeping track of an item in inventory.'''
name: str
unit_price: float
quantity_on_hand: int = 0
def __init__(
self,
name: str,
unit_price: float,
quantity_on_hand: int = 0
) -> None:
self.name = name
self.unit_price = unit_price
self.quantity_on_hand = quantity_on_hand
def total_cost(self) -> float:
return self.unit_price * self.quantity_on_hand
def __repr__(self) -> str:
return (
'InventoryItem('
f'name={self.name!r}, unit_price={self.unit_price!r}, '
f'quantity_on_hand={self.quantity_on_hand!r})'
def __hash__(self) -> int:
return hash((self.name, self.unit_price, self.quantity_on_hand))
def __eq__(self, other) -> bool:
if not isinstance(other, InventoryItem):
return NotImplemented
return (
(self.name, self.unit_price, self.quantity_on_hand) ==
(other.name, other.unit_price, other.quantity_on_hand))
★★★★★★★★★★★★★★★★ dataclasses을 사용하다
from dataclasses import dataclass
@dataclass(unsafe_hash=True)
class InventoryItem:
'''Class for keeping track of an item in inventory.'''
name: str
unit_price: float
quantity_on_hand: int = 0
def total_cost(self) -> float:
return self.unit_price * self.quantity_on_hand
을 생성할 수 있습니다(비교 방법을 할 수 .__lt__,__gt__등) 및 불변성을 처리합니다.
namedtuple클래스는 데이터 클래스이기도 하지만 기본적으로는 변경되지 않습니다(시퀀스이기도 합니다). dataclasses이 점에 있어서 훨씬 유연하고, 클래스로서 같은 역할을 완수할 수 있도록 쉽게 구성될 수 있습니다.
PEP는 슬롯, 검증자, 변환기, 메타데이터 등 더 많은 작업을 수행할 수 있는 프로젝트에서 영감을 받았습니다.
를 들어, 예를 들자면, 저는 에 '예'를 사용했어요.dataclasses코드 어드벤트 솔루션의 몇 가지에 대해서는, 7일째, 8일째, 11일째, 20일째의 솔루션을 참조해 주세요.
「 」를 사용하고 dataclassesPython 버전 < 3 . 7 の module then 、백포트된 모듈(3.6 필요)을 설치하거나attrs를 참조해 주세요.
개요
그 문제는 해결되었다.그러나 이 답변은 데이터클래스의 기본적인 이해를 돕기 위해 몇 가지 실제 예를 추가합니다.
파이썬 데이터 클래스는 정확히 무엇이며 언제 사용하는 것이 가장 좋은가?
- 코드 생성기: 보일러 플레이트 코드를 생성합니다.일반 클래스에서 특수한 메서드를 구현할지 데이터 클래스에서 자동으로 구현할지 선택할 수 있습니다.
- 데이터 컨테이너: 데이터(예: 튜플 및 딕트)를 보관하는 구조물. 종종 클래스 등의 도트 포함 속성 액세스가 있습니다.
"변환 가능한 명명된 튜플(기본값)"
후자의 문구는 다음과 같습니다.
- mutable: 기본적으로는 데이터 클래스 속성을 재할당할 수 있습니다.임의로 변경할 수 있습니다(아래 예 참조).
- named tuple: 도트 포함 Atribute 접근권이 있습니다.
namedtuple또는 일반 수업입니다. - default : Atribute에 기본값을 할당할 수 있습니다.
일반 클래스에 비해 주로 보일러 플레이트 코드를 입력하는 데 드는 비용이 절감됩니다.
특징들
다음은 데이터 클래스 기능(TL;DR)의 개요입니다.다음 섹션의 요약 표를 참조하십시오).
얻을 수 있는 것
다음은 기본적으로 데이터클래스에서 얻을 수 있는 기능입니다.
속성 + 표현 + 비교
import dataclasses
@dataclasses.dataclass
#@dataclasses.dataclass() # alternative
class Color:
r : int = 0
g : int = 0
b : int = 0
는, 으로 「이러다」, 「이러다」로 됩니다.True:
@dataclasses.dataclass(init=True, repr=True, eq=True)
켤 수 있는 것
를 「키워드」로 하면, 그 할 수 있습니다.True.
주문
@dataclasses.dataclass(order=True)
class Color:
r : int = 0
g : int = 0
b : int = 0
연산자: 「」 「」 「」 「」 「」 「」).< > <= >=)는 보다 강력한 동등성 검정을 사용하는 경우와 유사합니다.
해시 가능, 가변 가능
@dataclasses.dataclass(unsafe_hash=True) # override base `__hash__`
class Color:
...
오브젝트는 잠재적으로 변경 가능하지만(원하지 않을 수 있음) 해시가 구현됩니다.
해시 가능, 불변
@dataclasses.dataclass(frozen=True) # `eq=True` (default) to be immutable
class Color:
...
이제 해시가 구현되었으며 개체를 변경하거나 속성에 할당할 수 없습니다.
는 어느 쪽인가로 수 .unsafe_hash=True ★★★★★★★★★★★★★★★★★」frozen=True.
자세한 내용은 원본 해시 논리 테이블도 참조하십시오.
얻을 수 없는 것
다음의 기능을 취득하려면 , 특수한 방법을 수동으로 실장할 필요가 있습니다.
포장을 풀고 있다
@dataclasses.dataclass
class Color:
r : int = 0
g : int = 0
b : int = 0
def __iter__(self):
yield from dataclasses.astuple(self)
최적화
@dataclasses.dataclass
class SlottedColor:
__slots__ = ["r", "b", "g"]
r : int
g : int
b : int
이제 개체 크기가 축소되었습니다.
>>> imp sys
>>> sys.getsizeof(Color)
1056
>>> sys.getsizeof(SlottedColor)
888
따라서는, 「」가 됩니다.__slots__아트리뷰트입니다.되지 않습니다.디폴트 할당 이외의 경우는, 「」, 「」가 허가됩니다.그렇지 않으면ValueError인스톨 됩니다.
자세한 내용은 이 블로그 투고 슬롯을 참조하십시오.
요약표
+----------------------+----------------------+----------------------------------------------------+-----------------------------------------+
| Feature | Keyword | Example | Implement in a Class |
+----------------------+----------------------+----------------------------------------------------+-----------------------------------------+
| Attributes | init | Color().r -> 0 | __init__ |
| Representation | repr | Color() -> Color(r=0, g=0, b=0) | __repr__ |
| Comparision* | eq | Color() == Color(0, 0, 0) -> True | __eq__ |
| | | | |
| Order | order | sorted([Color(0, 50, 0), Color()]) -> ... | __lt__, __le__, __gt__, __ge__ |
| Hashable | unsafe_hash/frozen | {Color(), {Color()}} -> {Color(r=0, g=0, b=0)} | __hash__ |
| Immutable | frozen + eq | Color().r = 10 -> TypeError | __setattr__, __delattr__ |
| | | | |
| Unpacking+ | - | r, g, b = Color() | __iter__ |
| Optimization+ | - | sys.getsizeof(SlottedColor) -> 888 | __slots__ |
+----------------------+----------------------+----------------------------------------------------+-----------------------------------------+
+이러한 메서드는 자동으로 생성되지 않으므로 데이터 클래스에서 수동으로 구현해야 합니다.
* __ne__는 불필요하기 때문에 실장되어 있지 않습니다.
기타 기능
초기화 후
@dataclasses.dataclass
class RGBA:
r : int = 0
g : int = 0
b : int = 0
a : float = 1.0
def __post_init__(self):
self.a : int = int(self.a * 255)
RGBA(127, 0, 255, 0.5)
# RGBA(r=127, g=0, b=255, a=127)
상속
@dataclasses.dataclass
class RGBA(Color):
a : int = 0
변환
데이터 클래스를 튜플 또는 딕트로 재귀적으로 변환합니다.
>>> dataclasses.astuple(Color(128, 0, 255))
(128, 0, 255)
>>> dataclasses.asdict(Color(128, 0, 255))
{'r': 128, 'g': 0, 'b': 255}
제한 사항
레퍼런스
- R. 데이터클래스에 대한 헤팅거의 강연: 모든 코드 생성기를 종료하는 코드 생성기
- 더 쉬운 수업에 대한 T. Hunner의 강연: 모든 Cruft가 없는 Python 클래스
- 해싱 세부사항에 대한 Python 문서
- Python 3.7의 데이터 클래스 궁극의 가이드
- A. Python 3.7 데이터 클래스의 간단한 투어에 관한 Shaw의 블로그 투고
- E. Smith의 데이터 클래스상의 github 저장소
PEP 사양부터:
클래스 데코레이터는 PEP 526, "변수 주석 구문"에 정의된 유형의 주석을 가진 변수에 대한 클래스 정의를 검사한다.이 문서에서는 이러한 변수를 필드라고 부릅니다.이러한 필드를 사용하여 데코레이터는 생성된 메서드 정의를 클래스에 추가하여 인스턴스 초기화, repr, 비교 메서드 및 사양 섹션에서 설명한 기타 메서드를 지원합니다.이러한 클래스는 데이터 클래스라고 불리지만 클래스는 특별한 것이 없습니다.디케이터는 생성된 메서드를 클래스에 추가하고 주어진 것과 동일한 클래스를 반환합니다.
그@dataclass생성기는 자신을 정의해야 하는 메서드를 클래스에 추가합니다.__repr__,__init__,__lt__,그리고.__gt__.
이 단순한 클래스를 고려하십시오.Foo
from dataclasses import dataclass
@dataclass
class Foo:
def bar():
pass
여기 있습니다dir()내장 비교.왼쪽에는,Foo@dataclass 데코레이터가 없고 오른쪽이 @dataclass 데코레이터가 있습니다.
여기 또 다른 차이점이 있습니다.inspect모듈을 참조해 주세요.
언급URL : https://stackoverflow.com/questions/47955263/what-are-data-classes-and-how-are-they-different-from-common-classes
'source' 카테고리의 다른 글
| 준비된 스테이트먼트에서 테이블 이름을 파라미터화할 수 있습니까? (0) | 2022.11.01 |
|---|---|
| Panda의 데이터 프레임은 각 그룹의 첫 번째 행을 가져옵니다. (0) | 2022.11.01 |
| MySQL에서 AUTO_INCREMENT를 리셋하는 방법 (0) | 2022.11.01 |
| MAMP에서 PHP 5.5.3에 대한 캐시를 중지합니다. (0) | 2022.11.01 |
| Gradle - 종속성의 최신 릴리스 버전을 가져옵니다. (0) | 2022.11.01 |

