[解決済み】データクラスとは何ですか、一般的なクラスとどう違うのですか?
質問
と PEP 557 データクラスがPythonの標準ライブラリに導入されました。
これらは
@dataclass
デコレータで、それらは "mutable namedtuples with default" であるとされていますが、これが実際に何を意味するのか、一般的なクラスとどう違うのか、私はよく理解していません。
Pythonのデータクラスとは一体何なのか、また、いつ使うのがベストなのか?
どのように解決するのですか?
データクラスは、多くのロジックを含むのではなく、状態を保存することに特化した通常のクラスです。ほとんどが属性で構成されるクラスを作成するたびに、データクラスが作成されます。
の内容
dataclasses
モジュールが行うのは
より簡単に
データクラスを作成することができます。これは多くの定型句を処理してくれます。
これは、データクラスがハッシュ化可能でなければならない場合に特に有用です。
__hash__
メソッドと同様に
__eq__
メソッドを使用します。もし、カスタムの
__repr__
メソッドは、デバッグを容易にするために、非常に冗長になることがあります。
class InventoryItem:
'''Class for keeping track of an item in inventory.'''
name: str
unit_price: float
quantity_on_hand: int = 0
def __init__(
self,
name: str,
unit_price: float,
quantity_on_hand: int = 0
) -> None:
self.name = name
self.unit_price = unit_price
self.quantity_on_hand = quantity_on_hand
def total_cost(self) -> float:
return self.unit_price * self.quantity_on_hand
def __repr__(self) -> str:
return (
'InventoryItem('
f'name={self.name!r}, unit_price={self.unit_price!r}, '
f'quantity_on_hand={self.quantity_on_hand!r})'
def __hash__(self) -> int:
return hash((self.name, self.unit_price, self.quantity_on_hand))
def __eq__(self, other) -> bool:
if not isinstance(other, InventoryItem):
return NotImplemented
return (
(self.name, self.unit_price, self.quantity_on_hand) ==
(other.name, other.unit_price, other.quantity_on_hand))
と
dataclasses
に減らすことができます。
from dataclasses import dataclass
@dataclass(unsafe_hash=True)
class InventoryItem:
'''Class for keeping track of an item in inventory.'''
name: str
unit_price: float
quantity_on_hand: int = 0
def total_cost(self) -> float:
return self.unit_price * self.quantity_on_hand
同じクラス・デコレーターで、比較メソッドも生成できます (
__lt__
,
__gt__
など)、イミュータビリティを扱う。
namedtuple
クラスもデータクラスですが、デフォルトでイミュータブルです(シーケンスであると同時に)。
dataclasses
は、この点ではるかに柔軟性があり、以下のような構造を簡単に作成することができます。
と同じ役割を果たします。
namedtuple
クラス
.
このPEPは
attrs
プロジェクト
は、さらに多くのこと(スロット、バリデータ、コンバータ、メタデータなどを含む)を行うことができます。
もし、いくつかの例を見たいのであれば、私は最近
dataclasses
を、私のいくつかの
コードの冒険
の解決策をご覧ください。
7日目
,
8日目
,
11日目
そして
20日目
.
を使いたい場合は
dataclasses
モジュールのインストールは、Python のバージョン < 3.7 では
バックポートモジュール
(3.6が必要) または
attrs
プロジェクトに参加しています。
関連
-
PythonはWordの読み書きの変更操作を実装している
-
[解決済み】「RuntimeError: dictionary changed size during iteration」エラーを回避する方法とは?
-
[解決済み】 'numpy.float64' オブジェクトは反復可能ではない
-
[解決済み] 最近のPythonでカスタム例外を宣言する適切な方法?
-
[解決済み] Pythonでシングルトンを作成する
-
[解決済み] 億の相対的輸入
-
[解決済み] mixinとは何か、なぜ有用なのか?
-
[解決済み] Pythonの__future__は何に使うのか、いつ、どのように使うのか、その仕組みについて
-
[解決済み] Python 3.3のyield from構文は、実際にはどのような用途に使われるのでしょうか。
-
[解決済み】type()とisinstance()の違いは何ですか?)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
風力制御におけるKS原理を深く理解するためのpythonアルゴリズム
-
Pythonの@decoratorsについてまとめてみました。
-
[解決済み] _tkinter.TclError: 表示名がなく、$DISPLAY環境変数もない。
-
[解決済み] builtins.TypeError: strでなければならない、bytesではない
-
[解決済み】インポートエラー。モジュール名 urllib2 がない
-
[解決済み】Flask ImportError: Flask という名前のモジュールがない
-
[解決済み】Python: OverflowError: 数学の範囲エラー
-
[解決済み】NameError: 名前 'self' が定義されていません。
-
[解決済み] 名前付きタプルおよびオプションのキーワード引数のデフォルト値
-
[解決済み] Pythonで変数の引数(kwargs)からクラスの属性を設定するにはどうすればよいか