>  기사  >  백엔드 개발  >  Python에서 데이터 클래스는 어떻게 사용됩니까?

Python에서 데이터 클래스는 어떻게 사용됩니까?

WBOY
WBOY앞으로
2023-04-23 17:22:071439검색

Python3.7에서는 데이터 클래스를 도입했습니다. 데이터 클래스 데코레이터는 Python 클래스를 데이터 클래스로 선언할 수 있습니다. 데이터 클래스는 일반적으로 다음과 같은 특징을 갖습니다.

  • 데이터 클래스는 특정 데이터 유형을 나타내고, 데이터 객체는 엔터티의 속성을 포함한 특정 유형의 엔터티.

  • 동일한 유형의 객체를 비교할 수 있습니다(예: 보다 큼, 작거나 같음).

데이터 클래스 정의

본질적으로 데이터 클래스에는 특별한 것이 없습니다. 단지 @dataclass 데코레이터가 __repr__, init, __eq__ 등과 같은 일련의 메서드를 자동으로 생성한다는 것뿐입니다. 데이터 클래스 정의:

from dataclasses import dataclass

@dataclass
class A:
  normal: str
  defVal: int = 0

Decorator

데이터 클래스의 전체 형식은 다음과 같습니다(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와frozen이 모두 true이면 기본적으로 __hash__() 메서드가 생성됩니다.
    • eq가 true이고frozen이 false이면 __hash__()는 None으로 설정되고 다음으로 표시됩니다. unhashable(변경 가능하기 때문에 그렇습니다)

    • eq가 false이면 __hash__()는 변경되지 않고 유지됩니다. 즉, 슈퍼클래스의 __hash__() 메서드가 사용됩니다(수퍼클래스가 객체인 경우 id- 기반 해싱).

    • frozen: true인 경우 인스턴스가 초기화된 후에 속성을 수정할 수 없습니다.
  • field

  • 필드 메소드를 통해 속성을 사용자 정의할 수 있습니다.
dataclasses.field(*, default=MISSING, default_factory=MISSING, repr =True, hash=None, init=True, 비교=True, 메타데이터=None):


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__ 함수를 추가합니다.

  • 데이터 비교

  • 는 @dataclass( order = True) ( ​​__eq__ 및 __lt__):
  • 위와 같이 속성(필드)에 의해 생성된 튜플을 통해 비교가 수행되며, 비교 튜플은 (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) ): 필드 필드 객체의 튜플을 반환합니다.

asdict(instance, *, dict_factory=dict): 데이터 클래스를 사전, (이름:값) 쌍으로 변환

    astuple(instance, *, tuple_factory=tuple) ) : 데이터 클래스를 튜플로 변환합니다.
  • replace(instance, **changes): 인스턴스와 동일한 유형의 새 객체를 생성하고 변경 사항은 수정할 값입니다.

위 내용은 Python에서 데이터 클래스는 어떻게 사용됩니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제