この記事では、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 つのオプションは、オブジェクトをハッシュできるかどうかを決定します。これは、クラスのオブジェクトを辞書キーとして使用する場合に必要です。
以上がPython 3.7の新機能であるデータクラスデコレータの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。