Python の構造体

Vaibhav Vaibhav 2023年10月10日
Python の構造体

Python はオブジェクト指向プログラミング言語であり、クラスとオブジェクトがあることを意味します。C はオブジェクト指向プログラミング言語ではありませんが、C を使用して関数型プログラミングしか実行できないことを意味します。ただし、C には、ユーザー定義のデータ型である構造体が含まれています。

Python には構造体がありませんが、それらを実装したり、他のオブジェクト、つまりデータクラスを使用してそれらの動作を表現したりすることができます。データクラスは、フィールドと、これらのフィールドを操作するための CRUD メソッド(ゲッターとセッター)のみを含むクラスです。これらのクラスの主な目的は、データを格納したり、一部のデータをパッケージの形式で表現したりすることです。データクラスはエンティティを表します。エンティティには複数のパラメータまたはプロパティがあるため、データクラスを使用すると、すべてを 1つのオブジェクトに簡単にパッケージ化できます。

この記事では、Python でデータクラスを使用する方法を学習します。

Python のデータクラス

Python 3.7 ではデータクラスが導入されました。データクラスはプリミティブ Python クラスを使用して実装できますが、データクラスは必要な機能のほとんどをバックグラウンドで実装し、データクラスの Python コードを短くして読みやすくします。プリミティブ Python クラスを使用して実装すると、より多くの制御が可能になりますが、データクラスが大きくなると、実装が乱雑で大規模になり、管理できなくなる可能性があります。

Python には、dataclasses モジュール内で定義されたデコレータ dataclass があります。このデコレータは、__init__()__repr__() などのデータクラス内に必要な特別なメソッドを自動的に追加します。

これが例です。

from dataclasses import dataclass


@dataclass
class Item:
    name: str
    price: float
    quantity: int

    def total_cost(self) -> float:
        return self.price * self.quantity

上記のように、@dataclass デコレータは特別なメソッドを自動的に追加します。これは、次の __init__() メソッドが自動的に追加されることを意味します。

def __init__(self, name: str, price: float, quantity: int = 0):
    self.name = name
    self.price = price
    self.quantity = quantity

さらに、このデータクラスを使用して Item タイプのオブジェクトを作成でき、これらのオブジェクトは通常のクラスオブジェクトのように扱うことができます。

from dataclasses import dataclass


@dataclass
class Item:
    name: str
    price: float
    quantity: int

    def total_cost(self):
        return self.price * self.quantity


a = Item("Chocolate", 25, 100)
b = Item("Chips", 35, 150)
c = Item("Cookie", 10, 50)
print(a)
print(b)
print(c)
print(a.total_cost())
print(b.total_cost())
print(c.total_cost())

dataclass デコレータにはいくつかのパラメータがあります。

  • init - True デフォルトで。True の場合、データクラスの __init__() メソッドが定義されます。
  • repr - True デフォルトで。True の場合、データクラスの __repr__() メソッドが定義されます。
  • eq - True デフォルトで。True の場合、データクラスの __eq__() メソッドが定義されます。
  • order - False デフォルトで。True の場合、データクラスの __lt__()__le__()__gt__()、および __ge__() メソッドが定義されます。
  • unsafe_hash - デフォルトでは FalseFalse の場合、データクラスの __hash__() メソッドが定義されます。
  • frozen - False デフォルトで。True の場合、データクラスの属性は凍結されます。つまり、一度初期化すると、それ以上操作することはできません。
  • match_args - デフォルトでは True
  • kw_only - False デフォルトで。True の場合、データクラスのすべてのフィールドがキーワードのみとしてマークされます。
  • slots - False デフォルトで。

これらのパラメーターは、クラス実装の上に dataclass デコレーターを配置するときに構成できます。同じ例を以下に示します。

@dataclass
class A:
    pass


@dataclass(init=True, repr=True, order=True)
class B:
    pass


@dataclass(
    eq=True,
    order=False,
    unsafe_hash=True,
)
class C:
    pass

モジュール dataclasses の詳細については、公式ドキュメントこちらを参照してください。

著者: Vaibhav Vaibhav
Vaibhav Vaibhav avatar Vaibhav Vaibhav avatar

Vaibhav is an artificial intelligence and cloud computing stan. He likes to build end-to-end full-stack web and mobile applications. Besides computer science and technology, he loves playing cricket and badminton, going on bike rides, and doodling.

関連記事 - Python Dataclass