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

Python 3.7の新機能であるデータクラスデコレータの詳細な説明

不言
不言オリジナル
2018-04-21 14:44:591780ブラウズ

この記事では、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 までご連絡ください。