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 文字列には、クラス名、各フィールド名、およびその 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)
データクラス デコレータによって変更されたクラス:
__init__ を定義する必要はなく、データクラスが自動的に処理します;
メンバー属性 (および型ヒント) を読みやすい方法で事前定義し、デフォルト値を定義します。
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排序
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自动赋值
以上がPython ではデータクラスはどのように使用されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。