検索
ホームページバックエンド開発Python チュートリアルPython 3.7の新機能であるデータクラスデコレータの詳細な説明

この記事では、Python 3.7 の新機能であるデータクラス デコレーターに関する関連情報を、サンプル コードを通じて詳細に紹介します。これは、学習や仕事に必要な学習に役立ちます。一緒に勉強しましょう。

はじめに

Python 3.7 はこの夏にリリースされます。Python 3.7 には多くの新機能が追加されます:

  • さまざまな文字セットの改善

  • アノテーションの遅延評価

  • そしてデータクラスのサポート

最もエキサイティングな新機能の 1 つは、データクラス デコレータです。

データクラスとは

ほとんどの Python 開発者は、次のような多くのクラスを作成しました:

class MyClass:
 def __init__(self, var_a, var_b):
 self.var_a = var_a
 self.var_b = var_b

dataclass は、単純なケース (__init__ など) のメソッドを自動的に生成できます これらのパラメーターを受け入れて割り当てます前の小さな例は次のように書き換えることができます:

@dataclass
class MyClass:
 var_a: str
 var_b: str

それでは、例を通してその使用方法を見てみましょう

Star Wars API

リクエストを使用できます Star Wars からリソースを取得しますAPI:

response = requests.get('https://swapi.co/api/films/1/')
dictionary = response.json()

辞書 (簡略化) の結果を見てみましょう:

{
 'characters': ['https://swapi.co/api/people/1/',… ],
 'created': '2014-12-10T14:23:31.880000Z',
 'director': 'George Lucas',
 'edited': '2015-04-11T09:46:52.774897Z',
 'episode_id': 4,
 'opening_crawl': 'It is a period of civil war.\r\n … ',
 'planets': ['https://swapi.co/api/planets/2/', … ],
 'producer': 'Gary Kurtz, Rick McCallum',
 'release_date': '1977-05-25',
 'species': ['https://swapi.co/api/species/5/',…],
 'starships': ['https://swapi.co/api/starships/2/',…],
 'title': 'A New Hope',
 'url': 'https://swapi.co/api/films/1/',
 'vehicles': ['https://swapi.co/api/vehicles/4/',…]

API を適切にカプセル化するには、ユーザーが使用できるオブジェクトを作成する必要があります。アプリケーションで使用できるため、Python 3.6 では、/films/endpoint へのリクエスト応答を含むオブジェクトを定義します:

class StarWarsMovie:
 def __init__(self,
   title: str,
   episode_id: int,
   opening_crawl: str,
   director: str,
   producer: str,
   release_date: datetime,
   characters: List[str],
   planets: List[str],
   starships: List[str],
   vehicles: List[str],
   species: List[str],
   created: datetime,
   edited: datetime,
   url: str
   ):

 self.title = title
 self.episode_id = episode_id
 self.opening_crawl= opening_crawl
 self.director = director
 self.producer = producer
 self.release_date = release_date
 self.characters = characters
 self.planets = planets
 self.starships = starships
 self.vehicles = vehicles
 self.species = species
 self.created = created
 self.edited = edited
 self.url = url

 if type(self.release_date) is str:
  self.release_date = dateutil.parser.parse(self.release_date)

 if type(self.created) is str:
  self.created = dateutil.parser.parse(self.created)

 if type(self.edited) is str:
  self.edited = dateutil.parser.parse(self.edited)

注意深い読者の方は、重複したコードがあることに気づいたかもしれません。

これはデータクラス デコレータを使用する典型的なケースです。少し検証して、主にデータを保持するために使用されるクラスを作成する必要があるため、何を変更する必要があるかを見てみましょう。

まず、データ クラス デコレーターのオプションを指定しない場合、生成されるメソッドは __init__、__eq__、および __repr__ です (__repr__ を定義しているが、_ _str__ を定義していない場合)。 (データ クラスだけでなく) __repr__ を返す出力 __str__ メソッドを実装します。したがって、コードを次のように変更して 4 つの dunder メソッドを実装するだけです:

@dataclass
class StarWarsMovie:
 title: str
 episode_id: int
 opening_crawl: str
 director: str
 producer: str
 release_date: datetime
 characters: List[str]
 planets: List[str]
 starships: List[str]
 vehicles: List[str]
 species: List[str]
 created: datetime
 edited: datetime
 url: str

データ クラス デコレータが生成する対応するメソッドを追加できるようにするために、__init__ メソッドを削除しました。ただし、その過程で一部の機能が失われています。Python 3.6 コンストラクターはすべての値を定義するだけでなく、日付の解析も試みます。データ クラスでこれを行うにはどうすればよいでしょうか?

__init__ をオーバーライドしたい場合は、データ クラスの利点が失われるため、追加の機能を処理したい場合は、新しいダンダー メソッド __post_init__ を使用できます。ラッパー クラスの __post_init__ メソッドが何であるかを見てみましょう。 :

りー

それです! データ クラス デコレータを使用すると、コードの 3 分の 2 でクラスを実装できます。

さらに良い点

データクラスは、デコレータのオプションを使用することでユースケースに合わせてさらにカスタマイズできます。デフォルトのオプションは次のとおりです:

def __post_init__(self):
 if type(self.release_date) is str:
  self.release_date = dateutil.parser.parse(self.release_date)

 if type(self.created) is str:
  self.created = dateutil.parser.parse(self.created)

 if type(self.edited) is str:
  self.edited = dateutil.parser.parse(self.edited)

init は __init__ ダンダーを生成するかどうかを決定しますMethod

  • repr は __repr__ dunder メソッドを生成するかどうかを決定します

  • eq は __eq__ dunder メソッドに対して同じことを行い、等価性チェック (your_class_instance == another_instance) の動作を決定します

  • order は実際には 4 つを作成しますdunder メソッド。これらは、より小さいか、より大きいか、あるいはその両方のすべてのチェックの動作を決定します。true に設定すると、オブジェクトのリストを並べ替えることができます。

  • 最後の 2 つのオプションは、オブジェクトをハッシュできるかどうかを決定します。これは、クラスのオブジェクトを辞書キーとして使用する場合に必要です。

  • 詳細については、PEP 557 -- データクラス


を参照してください。

以上がPython 3.7の新機能であるデータクラスデコレータの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
どのデータ型をPythonアレイに保存できますか?どのデータ型をPythonアレイに保存できますか?Apr 27, 2025 am 12:11 AM

Pythonlistscanstoreanydatatype,arraymodulearraysstoreonetype,andNumPyarraysarefornumericalcomputations.1)Listsareversatilebutlessmemory-efficient.2)Arraymodulearraysarememory-efficientforhomogeneousdata.3)NumPyarraysareoptimizedforperformanceinscient

Pythonアレイに間違ったデータ型の値を保存しようとするとどうなりますか?Pythonアレイに間違ったデータ型の値を保存しようとするとどうなりますか?Apr 27, 2025 am 12:10 AM

heouttemptemptostoreavure ofthewrongdatatypeinapythonarray、yure counteractypeerror.thisduetothearraymodule'sstricttypeeencultionyを使用します

Python Standard Libraryの一部はどれですか:リストまたは配列はどれですか?Python Standard Libraryの一部はどれですか:リストまたは配列はどれですか?Apr 27, 2025 am 12:03 AM

PythonListSarePartOfThestAndardarenot.liestareBuilting-in、versatile、forStoringCollectionsのpythonlistarepart。

スクリプトが間違ったPythonバージョンで実行されるかどうかを確認する必要がありますか?スクリプトが間違ったPythonバージョンで実行されるかどうかを確認する必要がありますか?Apr 27, 2025 am 12:01 AM

theScriptisrunningwithwrongthonversionduetorectRectDefaultEntertersettings.tofixthis:1)CheckthedededefaultHaulthonsionsingpython - versionorpython3-- version.2)usevirtualenvironmentsbycreatingonewiththon3.9-mvenvmyenv、andverixe

Pythonアレイで実行できる一般的な操作は何ですか?Pythonアレイで実行できる一般的な操作は何ですか?Apr 26, 2025 am 12:22 AM

PythonArraysSupportVariousoperations:1)SlicingExtractsSubsets、2)Appending/ExtendingAdddesements、3)inSertingSelementSatspecificpositions、4)remvingingDeletesements、5)sorting/verversingsorder、and6)listenionsionsionsionsionscreatenewlistsebasedexistin

一般的に使用されているnumpy配列はどのようなアプリケーションにありますか?一般的に使用されているnumpy配列はどのようなアプリケーションにありますか?Apr 26, 2025 am 12:13 AM

numpyarraysAressertialentionsionceivationsefirication-efficientnumericalcomputations andDatamanipulation.theyarecrucialindatascience、mashineelearning、物理学、エンジニアリング、および促進可能性への適用性、scaledatiencyを効率的に、forexample、infinancialanalyyy

Pythonのリスト上の配列を使用するのはいつですか?Pythonのリスト上の配列を使用するのはいつですか?Apr 26, 2025 am 12:12 AM

UseanArray.ArrayOverAlistinPythonは、Performance-criticalCode.1)homogeneousdata:araysavememorywithpedelements.2)Performance-criticalcode:Araysofterbetterbetterfornumerumerumericaleperations.3)interf

すべてのリスト操作は配列でサポートされていますか?なぜまたはなぜですか?すべてのリスト操作は配列でサポートされていますか?なぜまたはなぜですか?Apr 26, 2025 am 12:05 AM

いいえ、notallistoperationSaresuptedbyarrays、andviceversa.1)arraysdonotsupportdynamicoperationslikeappendorintorintorinsertizizing、whosimpactsporformance.2)リスト

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。