Python3.7에서는 데이터 클래스를 도입했습니다. 데이터 클래스 데코레이터는 Python 클래스를 데이터 클래스로 선언할 수 있습니다. 데이터 클래스는 일반적으로 다음과 같은 특징을 갖습니다.
데이터 클래스는 특정 데이터 유형을 나타내고, 데이터 객체는 엔터티의 속성을 포함한 특정 유형의 엔터티.
동일한 유형의 객체를 비교할 수 있습니다(예: 보다 큼, 작거나 같음).
본질적으로 데이터 클래스에는 특별한 것이 없습니다. 단지 @dataclass 데코레이터가 __repr__, init, __eq__ 등과 같은 일련의 메서드를 자동으로 생성한다는 것뿐입니다. 데이터 클래스 정의:
from dataclasses import dataclass @dataclass class A: normal: str defVal: int = 0
데이터 클래스의 전체 형식은 다음과 같습니다(True는 해당 메소드를 생성하고 False는 생성하지 않습니다. 해당 메소드가 클래스에 정의된 경우 이 매개변수는 무시됩니다):
@dataclass(init=True, repr=True, eq=True, order=False, unsafe_hash=False,frozen=False):
init: __init__ 메소드가 기본적으로 생성됩니다.
repr: __repr__ 메소드는 기본적으로 생성됩니다. 문자열에는 클래스 이름, 각 필드 이름 및 해당 repr(클래스에 정의된 순서)이 포함됩니다.
eq: False인 경우 __eq__ 메소드가 생성됩니다. 전달되면 __eq__ 메서드는 데이터 클래스가 추가되지 않지만 object.__eq__(ID 비교)를 상속합니다.
order: __gt__, __ge__, __lt__, __le__ 메서드는 기본적으로 생성되지 않습니다. : False(기본값)인 경우 eq를 기반으로 하며 고정된 설정은 __hash__() 메서드(내장된 hash()에서 사용됨)를 생성합니다.
eq가 true이고frozen이 false이면 __hash__()는 None으로 설정되고 다음으로 표시됩니다. unhashable(변경 가능하기 때문에 그렇습니다)
eq가 false이면 __hash__()는 변경되지 않고 유지됩니다. 즉, 슈퍼클래스의 __hash__() 메서드가 사용됩니다(수퍼클래스가 객체인 경우 id- 기반 해싱).
field
default: 제공된 경우 이것이 이 필드의 기본값이 됩니다.
default_factory: 변수 기본값이 있는 필드를 지정하는 데 사용됩니다. 매개변수가 없는 호출 가능한 객체여야 합니다. 기본값과 상호 배타적입니다(동시에 지정할 수 없음).
init: true(기본값)인 경우 이 필드는 생성된 __init__() 메서드에 매개변수로 포함됩니다.
repr: true(기본값)인 경우 필드는 __repr__() 메서드에서 반환된 생성된 문자열에 포함됩니다.
compare: true(기본값)인 경우 생성된 동일성 및 비교 방법(__eq__(), __gt__() 등)에 필드가 포함됩니다.
hash: 부울 또는 없음일 수 있음:
은 None(기본값)이며 비교 값이 사용되며 이는 일반적으로 예상되는 동작입니다(이 값을 None 이외의 다른 값으로 설정하는 것은 권장되지 않음) ;
이 true인 경우 이 필드는 생성된 __hash__() 메서드에 포함됩니다.
해시=False로 설정하지만 비교=True(즉, 해시에서 필드를 제외하지만 여전히 비교에 사용) 그 이유는 필드에서 해시를 계산하는 데 비용이 많이 들기 때문입니다.
metadata: 이는 맵이거나 None일 수 있습니다. None은 빈 사전으로 처리됩니다. 이 값은 MappingProxyType()에 포함되어 읽기 전용으로 만들고 Field 개체에 노출됩니다(타사 확장 메커니즘으로 제공됨).
default_factory를 사용하여 기본값 생성:
from dataclasses import dataclass, field import random def build_marks() -> list: return [random.randint(0, 1000) for i in range(5)] @dataclass(order=True) class RandMark: marks: list = field(default_factory=build_marks) r = RandMark() # 使用build_marks生成默认值 print(r)
데이터 클래스 데코레이터로 장식된 클래스:
__init__을 정의할 필요가 없습니다. 데이터 클래스가 이를 자동으로 처리합니다. 읽기 방식 멤버 속성(및 유형 힌트) 및 기본값을 정의할 수 있습니다.
dataclass는 자동으로 __repr__ 함수를 추가합니다.
데이터 비교
위와 같이 속성(필드)에 의해 생성된 튜플을 통해 비교가 수행되며, 비교 튜플은 (normal, defVale)입니다.
비교=False로, 그렇지 않은 필드를 설정할 수 있습니다. 비교에 사용됨:@dataclass(order=True) class Student: name: str = field(compare=False) score: float s = [Student("mike", 90), Student("steven", 80), Student("orange", 70) ] print(sorted(s)) # 只根据score排序사후 처리사후 처리는 __post_init__을 통해 수행될 수 있습니다(__init__가 반환되기 전에 자동으로 호출됨):
from dataclasses import dataclass @dataclass class FloatNumber: val: float decimal: float = 0 integer: float = 0 def __post_init__(self): self.decimal, self.integer = math.modf(self.val) f = FloatNumber(1.2) # decimal与integer自动赋值dataclasses 메소드
dataclasses 내장 속성 및 메소드:
fields(class_or_instance) ): 필드 필드 객체의 튜플을 반환합니다.
위 내용은 Python에서 데이터 클래스는 어떻게 사용됩니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!