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
- デフォルトではFalse
。False
の場合、データクラスの__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
の詳細については、公式ドキュメントこちらを参照してください。