Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonのdataclassesモジュール入門:@dataclassデコレータでクラス定義を簡潔に

dataclassesモジュールとは

dataclassesは、Python 3.7以降の標準ライブラリに追加されたモジュールです。このモジュールが提供する@dataclassデコレータを使うと、ユーザー定義クラスに対して以下のような特殊メソッドを自動的に生成できます。

  • コンストラクタ:__init__()
  • 文字列表現:__repr__()
  • 等価比較(== 演算子のオーバーロード):__eq__()
  • その他いくつかのメソッド

これにより、データを保持するだけのクラスを、定型コード(ボイラープレート)をほとんど書かずに簡潔に定義できるようになります。

@dataclassデコレータのシグネチャ

dataclassデコレータは、次のようなシグネチャを持っています。

dataclass(init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False)

すべての引数にはブール値を指定し、対応する特殊メソッドを自動生成するかどうかを制御します。以下、各引数の役割を見ていきましょう。

init引数(デフォルト:True)

Trueの場合、__init__() メソッドが自動的に生成されます。なお、クラス側で明示的に __init__() を定義している場合は、この引数は無視されます。

Studentクラスの定義例

@dataclassデコレータを使って、Studentクラスを次のように定義できます。

from dataclasses import dataclass

@dataclass
class Student(object):
    name : str
    age : int
    percent : float

このとき自動生成される __init__() メソッドは、次のコードと同等になります。

def __init__(self, name: str, age: int, percent: float):
    self.name = name
    self.age = age
    self.percent = percent

repr引数(デフォルト:True)

Trueの場合、オブジェクトの正式な文字列表現を返す __repr__() メソッドが自動生成されます。クラスですでに __repr__() を定義している場合は、このパラメータは無視されます。

eq引数(デフォルト:True)

Trueの場合、等価比較演算子(==)に応答する __eq__() メソッドが自動生成されます。こちらも、クラスですでに __eq__() を定義している場合には無視されます。

order引数(デフォルト:False)

Trueに設定すると、大小比較のための特殊メソッド __lt__()__le__()__gt__()__ge__() が自動生成されます。これらはそれぞれ比較演算子 <、<=、>、>= を実装します。orderをTrueにしながらeqをFalseにするとValueErrorが発生します。また、クラスですでにこれらのメソッドのいずれかを定義している場合はTypeErrorとなります。

unsafe_hash引数(デフォルト:False)

Falseの場合、eqおよびfrozenの設定内容に応じて __hash__() メソッドが生成されます。

frozen引数(デフォルト:False)

Trueに設定すると、読み取り専用(イミュータブル)なインスタンスをエミュレートします。生成後の属性変更が禁止されるため、意図しないデータ改変を防ぎたい場合に有効です。

実行例

実際にインスタンスを生成して、等価比較を行ってみます。

>>> s1 = Student('Naveen', 21, 50.50)
>>> s2 = Student('Mangesh', 20, 50.00)
>>> s1 == s2
False

dataclassesモジュールの便利な関数

asdict():インスタンスを辞書に変換

この関数は、クラスのインスタンスを辞書(dict)オブジェクトに変換します。

>>> import dataclasses
>>> dataclasses.asdict(s1)
{'name': 'Naveen', 'age': 21, 'percent': 50.5}

astuple():インスタンスをタプルに変換

この関数は、クラスのインスタンスをタプルオブジェクトに変換します。

>>> dataclasses.astuple(s2)
('Mangesh', 20, 50.0)

make_dataclass():動的にデータクラスを作成

この関数は、fields引数として渡したタプルのリストをもとに、新しいデータクラスを実行時に動的に作成します。

>>> NewClass = dataclasses.make_dataclass('NewClass', [('x', int), ('y', float)])
>>> n = NewClass(10, 20)
>>> n
NewClass(x=10, y=20)

まとめ

dataclassesモジュールを活用すれば、__init__()__repr__() といった定型コードを手書きする必要がなくなり、クラス定義が大幅に簡潔になります。可読性・保守性の向上が期待でき、設定情報やAPIレスポンスなど、構造化されたデータを扱う場面で特に威力を発揮します。ぜひ日々のPython開発に取り入れてみてください。

  1. Pythonのdir()関数とは?使い方を実例付きで解説

    Pythonのdir()関数は、オブジェクトが持つ属性(アトリビュート)やメソッドの一覧をリスト形式で返す組み込み関数です。対象となるオブジェクトは、モジュール、文字列、リスト、辞書などPythonで扱えるあらゆるものが指定可能です。この記事では、dir()関数の基本的な使い方から、さまざまな場面での活用方法まで、具体例とともにわかりやすく解説します。引数なしでdir()を使うdir()を引数なしで呼び出すと、プログラム実行時点で利用可能な名前(変数・関数・クラスなど)の一覧が返されます。何もインポートしていない状態で実行した場合、Pythonの起動時に自動的に用意される標準ライブラリ関連の名

  2. Python・Pandasのquery()メソッドでデータを効率的にフィルタリングする方法

    Pandasは、データクレンジングやデータ分析などに幅広く利用されているPythonのライブラリです。本記事では、query()メソッドを使用して、指定したデータセットから条件に合致するデータを抽出する方法を解説します。query()メソッドでは、単一の条件だけでなく、複数の条件を組み合わせた絞り込みも可能です。データの読み込みまず、Pandasライブラリを使ってCSVファイルのデータをDataFrameとして読み込みます。以下のプログラムがその基本的なコードです。サンプルコードimport pandas as pd # CSVファイルからDataFrameを読み込む data = pd.r