Python3.7データクラスの概要

ちょっとオタクするのが楽しいこともあります。 Pythonは今日最も人気のあるスクリプト言語のXNUMXつであり、私たちもそれを気に入っています。 これが、LogicMonitorができる理由のXNUMXつです。 ご使用の環境でサポートされているスクリプトまたはプログラミング言語を実行します。 つまり、お気に入りの監視ツールでお気に入りの言語の最新機能を楽しむことができます(そうですか?)。 Pythonが副業である場合は、Python3.7のデータクラスを試してみてください。

過去を理解して現在を理解する

Javaの拡張機能であるGroovyとPowerShellは、ユーザーフレンドリーな方法でOOPを強力にサポートしていると私が信じているXNUMXつの言語です。 カスタムオブジェクトをすばやく操作し、その値をレポートできます。 Pythonは非常に人気があり強力ですが、少し遅れています。 過去の例をいくつか見るには、インターネットで「Python印刷クラス属性」を検索してください。 この記事の時点で、最も人気のある開発者リソースのXNUMXつであるStackOverflowからの上位の検索結果の一部を次に示します。

あなたが検索しようとするとそれはあまり良くありません クラスの公式Python2.7ドキュメント。 彼らの例がクラスに関する情報を印刷するたびに、あなたがあなたが見せたいものを正確にすでに知っていると仮定している、またはあなたが各クラス属性を明示的に印刷することに時間を費やしても構わないと思っていることに注意してください。

検索結果と回答、および私自身の経験に基づいて、カスタムPythonオブジェクトを操作する上でXNUMXつの主な課題がありました。

  1. クラス属性を印刷するための確立されたベースラインメソッドはありませんでした。 これにより、ユーザーは独自のソリューションを作成することになりました。これは、多くの場合、不完全、脆弱、低速、または複雑でした。 受け入れられているStackOverflowの回答の中には、Pythonに慣れていない場合でも、頭を悩ませる可能性があるものがあります。
  2. Stack Overflowの回答に見られるように、クラス属性を印刷するための効果的でクリーンなソリューションは、vars、dir、オブジェクトの内部ディクショナリ、文字列フォーマット、リスト内包表記など、不必要に細かいまたは特定のPython機能の知識に依存していました。 これらすべて、特に文字列の書式設定とリスト内包表記は学ぶ価値がありますが、オブジェクトクラスの属性を出力するためにこれらのいずれも必要とされるべきではありません。 ユーザーは単純な構文の使用に慣れています some_variableを出力します アイテムの値を表示するためであり、クラスごとに違いはありません。

スクリプトにあまり詳しくない人のために、アナロジーを使用して問題を説明しましょう。 Pythonクラスオブジェクトを、物語でいっぱいの物理的な新聞として想像してみましょう。 この新聞を印刷したのはあなたです。 あなたはすでに物語を知っています。 各段落、ストーリー、見出しを注意深く配置しました。 以前のPythonバージョンでは、新聞をPythonに渡して、健全性チェックとしてニュースレポートのいずれかを読むように依頼すると、ストーリー全体を提供するだけでなく、読みたい各段落を指定するようになりました。 あなたの幼児がそれを言うときかわいい; あなたの30歳の意欲的なジャーナリストがそれを言うとき、イライラし、心配します。

Pythonがアダルトを開始

遅咲きは決して咲かないよりはまし

2017年には、 PEP557 「主に属性ルックアップによってアクセス可能な値を格納するために存在する」概念化されたデータクラス、およびほぼ3.7.0年後、PythonXNUMXのリリースは正式に実装を提供しました。 データ型は型ヒントから便乗します(PEP484)および型注釈(PEP526)、それぞれPython3.5および3.6で導入されました。 オブジェクトの操作に関しては、人々は一貫してデータ型を予測できることを期待しています。 Pythonはまだ厳密に型指定された言語ではありませんが、型ヒントと注釈の組み合わせは、ユーザーとIDEの両方が、より大きなコードベースで作業するときに予想されるデータ型を知るのに役立ちます。

怠惰が自動化を推進

成熟のもう一つの部分は、あなたが気にかけていることと、それに集中してより多くの時間を費やす方法について正直であることです。 私だけの可能性もありますが、DataClassesが売られすぎているように感じます。あるいは、誰かが退屈なプロセスを処理することを本当に楽しんでいます。 からの正確な言葉 PEP557 データクラスに関しては、「[…]クラスについて特別なことは何もありません。デコレータは生成されたメソッドをクラスに追加し、指定されたのと同じクラスを返します。 […]データクラスを使用すると、これらのメソッドを作成および保守する必要がなくなります。」

これらの「生成されたメソッド」とは何ですか? 幸いなことに PEP557の要約 例を示します。 次のように定義されたPythonクラスがあるとします。

@dataclass class InventoryItem: '' '在庫内のアイテムを追跡するためのクラス' ''名前:str unit_price:float amount_on_hand:int = 0 def total_cost(self)-> float:return self.unit_price * self.quantity_on_hand

したがって、データクラスデコレータ(「@dataclass」)は、次のコードを自動的に生成します。

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 = amount_on_hand def __repr __(self):return f'InventoryItem(name = {self.name!r}、unit_price = {self.unit_price!r}、quantity_on_hand = {self.quantity_on_hand!r}) 'def __eq __(self、other):if other .__ class__ is self .__ class __:return(self .name、self.unit_price、self.quantity_on_hand)==(other.name、other.unit_price、other.quantity_on_hand)return NotImplemented def __ne __(self、other):if other .__ class__ is self .__ class __:return(self.name 、self.unit_price、self.quantity_on_hand)!=(other.name、other.unit_price、other.quantity_on_hand)return NotImplemented def __lt __(self、other):if other .__ class__ is self .__ class __:return(self.name、self .unit_price、self.quantity_on_hand)<(other.name、other.unit_price、other.quantity_on_hand)return NotImplemented def __le __(self、other):if other .__ class__ is self .__ class __:return(self.name、s elf.unit_price、self.quantity_on_hand)<=(other.name、other.unit_price、other.quantity_on_hand)return NotImplemented def __gt __(self、other):if other .__ class__ is self .__ class __:return(self.name、self。 unit_price、self.quantity_on_hand)>(other.name、other.unit_price、other.quantity_on_hand)return NotImplemented def __ge __(self、other):if other .__ class__ is self .__ class __:return(self.name、self.unit_price、self .quantity_on_hand)> =(other.name、other.unit_price、other.quantity_on_hand)return NotImplemented

それらの 30 自動生成されたコードの行は 属性:name、unit_price、およびquantity_on_hand。 これが大幅に売られていないと私が信じる理由は、クラス属性を追加すると、これらのメソッドを自分で作成して維持するための労力のレベルが非常に面倒になるためです。 誰がそれに対処したいと思いますか? そうですね、Pythonの寄稿者であるEric V. Smithはそうしていますが、部分的には彼に感謝しています。 貴社 する必要はありません!

データクラスの利点

これまでに得た情報に基づいて、データクラスの多くのメリットを確認できます。

  1. より簡潔で宣言型のクラス形式によるコードの読みやすさの向上
  2. 「dunder」(ダブルアンダースコア)メソッドの高速な自動セットアップまたは破棄
    1. 初期化:インスタンス化するときにクラスに指定した値を保存します
    2. 表現:クラスとその属性の文字列の説明を出力するために使用するもの
    3. 比較に等しい
    4. 比較と等しくない
    5. 比較より少ない
    6. 比較以下
    7. 比較よりも大きい
    8. 比較以上
    9. 凍結(不変):属性を設定および取得できるようにするもの。 「凍結」クラスでは、属性には初期値のみを指定できます。 これらの値は、初期化後に再度設定することはできません。
  3. 文字列表現に含まれる属性の迅速な自動フィルタリング。 これは、保守性の観点から、独自の箇条書きに値します。 クラスの属性/フィールドを宣言すると、クラスの詳細を出力するときにそれを含めるかどうかをすばやく指定できます。 これはセキュリティ上の大きなメリットにはなりませんが、データの保存や処理の能力を犠牲にすることなく、視覚的な混乱を減らすのに役立ちます。
  4. 型のヒントと注釈は、抽象化レイヤーの追加を開始した場合でも、ユーザーとIDEが変数に適用されるメソッドとプロパティを追跡するのに役立ちます。 これは、他の人と同じように人間であり、コードのオートコンプリートを使用している場合に特に役立ちます。
  5. printステートメントを使用してクラスとその属性を出力する標準的で簡潔な方法:
    some_variableを出力します

データクラスの警告

あたり PEP557、データクラスは、他のPythonライブラリを完全に置き換えることを意図したものではありません。 さらに、PEPの記事には、次の場合にデータクラスが適切でないと記載されています。

  • タプルまたはディクテーションとのAPI互換性が必要です。
  • によって提供されるものを超える型検証 PEP484 & 526 が必要であるか、値の検証または変換が必要です。

まとめ

Pythonデータクラスは、既存のPython機能を簡潔な宣言型構文に組み合わせて、主にデータストレージに使用されるクラスを管理する際のエクスペリエンスを向上させます。 Pythonデータクラスの主な利点のXNUMXつは、クラスとその属性の文字列表現をすばやく印刷できることです。 LogicMonitorの強力な拡張性により、Pythonデータクラスを他のすべての最新のPython機能の中で活用できます。 モニタリング & ポータル管理.