Python ではデータクラスはどのように使用されますか?

WBOY
リリース: 2023-04-23 17:22:07
転載
1437 人が閲覧しました

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 文字列には、クラス名、各フィールド名、およびその repr (クラスで定義された順序で);

  • eq: __eq__ メソッドはデフォルトで生成されます; False が渡された場合、__eq__ メソッドはデータクラスによって追加されませんが、継承 object.__eq__ (比較 ID);

  • order: __gt__、__ge__、__lt__、__le__ メソッドはデフォルトでは生成されません;

  • unsafe_hash : False (デフォルト) の場合、eq と frozen の設定に基づいて __hash__() メソッド (組み込み hash() によって使用される) が生成されます。

    • eq と frozen が両方とも true の場合、__hash__() メソッドがデフォルトで生成されます;

    • eq が true の場合凍結が false の場合、__hash__() は None に設定され、ハッシュ不可能としてマークされます (可変であるため、ハッシュ不可能です);

    • If eq が false の場合、__hash__()変更されないままになります。つまり、スーパークラスの __hash__() メソッドが使用されます (スーパークラスがオブジェクトの場合は、ID ベースのハッシュにフォールバックします)。

  • frozen: true の場合、インスタンスの初期化後はプロパティを変更できません。

フィールド

フィールドを渡すメソッド、カスタマイズ可能な属性:
dataclasses.field(*,default=MISSING,default_factory=MISSING,repr=True,hash=None,init=True,compare=True,metadata=None):

  • default: 指定した場合、これがこのフィールドのデフォルト値になります。

  • default_factory: 変数のデフォルト値を持つフィールドを指定するために使用されます。パラメータなしで呼び出し可能なオブジェクトである必要があります。デフォルトとは相互に排他的です (同時に指定することはできません)。

  • init: true (デフォルト) の場合、フィールドは生成された __init__() メソッドにパラメーターとして含まれます。

  • repr: true (デフォルト) の場合、フィールドは __repr__() メソッドによって返される生成された文字列に含まれます。

  • compare: true (デフォルト) の場合、フィールドは生成された等価メソッドおよび比較メソッド (__eq__()、__gt__() など) に含まれます。

  • ハッシュ: ブール値またはなしを指定できます:

  • はなし (デフォルト)、通常は予期される比較の値が使用されます。動作 (この値を None 以外に設定することは推奨されません);

  • が true の場合、このフィールドは生成された __hash__() メソッドに含まれます;

  • hash=False で Compare=True を設定する (つまり、フィールドをハッシュから除外するが比較に使用する) 考えられる理由の 1 つは、フィールドのハッシュの計算に非常にコストがかかるためです。

  • メタデータ: これはマップまたは 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)
ログイン後にコピー

Initialization

データクラス デコレータによって変更されたクラス:

  • __init__ を定義する必要はなく、データクラスが自動的に処理します;

  • メンバー属性 (および型ヒント) を読みやすい方法で事前定義し、デフォルト値を定義します。

  • ##dataclass は __repr__ 関数を自動的に追加します;

データ比較

比較は @dataclass(order = True) メソッド (__eq__ および __lt__):

比較は属性 (フィールド) によって生成されたタプルを通じて行われます。上記のように、比較タプルは (normal, defVale) です。

compare=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 の組み込みプロパティとメソッド:

  • fields(class_or_instance): フィールド Field オブジェクトのタプルを返します。

  • # asdict(instance, *, dict_factory=dict): データクラスを辞書に変換、(name:value) ペア;
  • astuple(instance, *, tuple_factory=tuple): データを変換クラスをタプルに変換;
  • replace(instance, **changes): インスタンスと同じ型の新しいオブジェクトを作成し、変更は変更する値です。

以上がPython ではデータクラスはどのように使用されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!