Address
304 North Cardinal St.
Dorchester Center, MA 02124

Work Hours
Monday to Friday: 7AM - 7PM
Weekend: 10AM - 5PM

Pythonのdataclassesモジュールが提供するdataclass() デコレータについての解説

【Python入門】dataclassesモジュールのdataclassデコレータの基本とメリットの解説

Pythonのdataclassesモジュールが提供するdataclass() デコレータについての解説

Pythonの便利なモジュールの1つにdataclassesモジュールというものがあります。今回はそのdataclassesモジュールが提供するdataclass() デコレータについての解説です。

前提知識:Pythonのデコレータとは?

前提知識としてPythonにおけるデコレータについては過去記事「【Python入門】デコレータの基本をわかりやすく解説」をご覧ください。

dataclassモジュールとは?

公式の説明では次のように書かれています。

機能

このモジュールは、init() や repr() のような special method を生成し、ユーザー定義のクラスに自動的に追加するデコレータや関数を提供します。

このdataclassesモジュールの中に、dataclass() デコレータというのが用意されています。このdataclass() デコレータの役割を簡単に説明すれば次のようなります。

普通クラスを新しく作るときは基本的に次のように、特殊メソッド(メソッドはクラス内で定義された関数)の___init__を書くコードが多いと思います。

class クラス名:

    def __init__(self, 仮引数1, 仮引数2, ......):
         self.変数1 = 仮引数1
         self.変数2 = 仮引数2
         ・・・
         ・・・
         ・・・
  
インスタンスオブジェクト = クラス名(実引数1, 実引数2, ......)

dataclassesモジュールの中にあるdataclassメソッドを使うと、この def __init__ブロックを自動的に作成してくれるというものです。ただし、コードとして明示的に追加(入力)されるわけではありません。

使い方

これらの生成されたメソッドで利用されるメンバー変数は PEP 526 型アノテーションを用いて定義されます。

これは次のような書き方をするということです。

class Hoge:

    """アノテーションを使って変数を定義"""
    para_one: int
    para_two: str
    para_three: float = 0.09

それでは実際の使用例を見ていきましょう。

コード例と解説

dataclassesモジュールのdataclassメソッドを使ったコード例

公式ドキュメントのコード例をそのまま掲載します。

from dataclasses import dataclass

@dataclass
class InventoryItem:
    """Class for keeping track of an item in inventory."""
    name: str
    unit_price: float
    quantity_on_hand: int = 0

まず最初にdataclassesモジュールのdataclass() デコレータを使うため

from~import・・・

次に、dataclass() デコレータは名前のとおりデコレータ(今回はクラスデコレータ)なので、

@dataclass
class クラス名

という書き方です。

乱暴に言えば、デコレータの対象となったクラス(被デコレートクラス)は、自動的に以下コード(dataclassesモジュールを使わない場合の書き方)へと変換されるというイメージです。

# 通常の書き方版
class InventoryItem:

    def __init__(self, name: str, unit_price: float, quantity_on_hand: int = 0):
        self.name = name
        self.unit_price = unit_price
        self.quantity_on_hand = quantity_on_hand

これら上下のコードを見比べると、上の書き方をする場合は、下(通常の書き方版)のように、

self.変数 = 変数

といったコードを書く必要がないということですね。その手間を少し省けるということです。

通常の書き方版コードのように、インタンスが生成された後の代入される段階での初期化処理のコードにおいて代入文を何個も書かなければならないことがありますが、その手間をdataclassesのdataclassメソッドを使うことで少し軽減してくれます。

__init__メソッドを作らないことも可能、または__init__メソッド以外のメソッドも作れる

さて上では単純に、

@dataclass

としましたが、これは、

@dataclass()

あるいは、

@dataclass(init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False, match_args=True, kw_only=False, slots=False, weakref_slot=False)
class C:

としても同じです。

特に、最後の引数を設定したパターンの使い方をご覧になればわかると思いますが、

init=True

となっていますね。このTrueをFalseにすれば、__init__メソッドの自動作成(?)はされません。このようにTrueとするかFalseとするかで動作を分けることができます。それは他の引数の、repr、eqなども同様です。

これらの引数init、repr、eqなどがどのような意味で、その値がどうなるかは公式ドキュメントに全て書かれているのでそちらをご覧ください。今回の解説での、

  • __init__メソッド
  • @dataclassデコレータの引数init

の2つがどのように対応しているのかがわかれば、他の引数についても十分理解できると思います。

Pythonをプロから短期間で合理的にマスターするなら、やはり動画による学習方法がわかりやすくオススメです。世界最大級のオンライン学習サイトUdemy(ユーデミー)【PR】ではPythonのプログラミング講座が入門~応用レベルまで幅広く展開されています。

Udemyの動画講座では講師に質問が可能、動画なのでプログラムの動きがわかりやすく理解しやすい、わかりにくいところを何度も繰り返し再生できる、プログラミングスクールよりもはるかに安いというメリットがあります。

その中でも次のような講座がおすすめです。

他にも多数のプログラミング講座があるのでぜひ活用し、合理的に短期間でプログラミングを身に着けましょう。

愛を分かち合いましょう