Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Pythonクラス基礎

Avatar for Geson Anko Geson Anko
February 16, 2025
81

 Pythonクラス基礎

Avatar for Geson Anko

Geson Anko

February 16, 2025
Tweet

Transcript

  1. 1 ⽬次 1. オブジェクト指向 2. Pythonのクラスについて 1. クラスの作り⽅ 2. インスタンス化

    3. メンバー関数(メソッド) 4. クラス property 5. 特殊なメンバー変数・関数 6. 特殊なクラス Enum 3. 基底クラスと継承 1. クラス継承 2. 継承の⽤途 3. 抽象基底クラス 4. 多重継承: Mixin 5. 継承の危険性 6. 継承を避ける⽅法 4. 参考⽂献
  2. 2 オブジェクト指向について • ⼤きく割愛 • オブジェクト指向については散々他で解説されているので。 • データとその関⼼のある処理をセットにしたもの。 • Ex.

    「ねこ」オブジェクトは「鳴き声」というデータをもち、「鳴く」という 処理を⾏うことができる。 • Object “🐱” has 🎶 • Object “🐱” can 🗣 • 参考: オブジェクト指向(OOP)を解説してみる • https://zenn.dev/cloud_ace/articles/29748ac0537c7f
  3. 3 オブジェクト指向について • クラス(類・型)とインスタンス(実体) • 猫 “🐱”という種類・典型には、 道端を歩く猫 “🐈” という実体がある。

    • クラスは 種類そのものである。 • インスタンスはその実態の⼀つである。 • 集合と要素とイメージすると良い。 • インスタンス化 (instantiate) • クラスを基に実体を構築 (Construct) すること クラス “🐱” 🐈 🐈⬛ インスタンス
  4. 7 インスタンス化 • 特殊メンバー関数`__init__`が呼ばれる。(コンストラクタ) • インスタンス⾃⾝が第⼀引数 (`self`)として与えられる。 • メモリが分離され、別のオブジェクトとなる。 •

    通常はここでメンバー変数の定義を⾏うことが多い。 ⚠ 以降、すべてのメンバ関数の 第1引数に`self`が与えられる。 i.e. メンバー関数 は通常 `self`引数 を必ず持つ。
  5. 8 メンバー関数(メソッド) • `staticmethod` • クラスをインスタンス化せずとも使⽤可能なメソッド • 第⼀引数にインスタンス `self`を持たない。 •

    `classmethod` • 第⼀引数に クラスオブジェクト⾃体 `cls` を受け取る。 • カスタムコンストラクタなどに使われる。
  6. 9 クラスのpropertyについて • Getter, Setter, Deleterを定義する。 • Getter: クラスから変数(属性)を取得する時に呼ぶメソッド •

    Setter: クラスの変数(属性)を変更するときに呼ぶメソッド • Deleter:クラスの変数(属性)を削除するときに呼ぶメソッド • ただのメンバー変数のように呼べるが、内部的に関数のような ものとなっている。(setterは値を受け取る) • ℹ `setter`を定義しなければ、値は読み取り専⽤になる • ℹ `deleter`を定義しなければ、値は削除できなくなる。 • クラス変数の⾼度なアクセス制御、副作⽤の実 装をするために⽤いることが多い。
  7. 10 特殊なメンバー変数・関数について • 特殊なメンバー変数 • __class__: インスタンスのクラスオブジェクトを返す。 • `__class__.__name__` クラス名を返す。

    • __dict__: オブジェクトの参照可能なメンバー名とオブジェクトの辞書を返す。 • 特殊なメンバー関数 • __del__: オブジェクトが破棄されるときに呼ばれる(del object) • __len__: len関数から呼ばれる。 (len(object)) • __eq__などの⽐較演算⼦系 • __add__などの算術演算⼦系 • __enter__, __exit__: コンテキストマネージャのフック(with 構⽂⽤) • __iter__, __next__: イテレータやジェネレータの定義 • __int__, __str__などのビルトイン型への変換メソッド( int(object), str(object)) • __getattibute__, __setattribute__などの属性参照時のフック • __getitem__, __setitem__などのアイテム参照のフック (object[0], object[0] = 1) 特に⼤事 特に⼤事 Pythonの不思議な 振る舞いの多くは ここで定義されるよ!
  8. 13 クラス継承 • 継承 • 基のクラスの機能を引き継いで、新たなクラスを作る • 機能追加・上書き、バリアント作成 • 基底クラス

    • 継承される基となるクラスのこと • `super` classとも⾔う。 • Tips: すべてのクラスは “object” を⾃動的に継承する
  9. 14 クラス継承の⽤途 1. 扱いやすいAPIを提供 • 複雑な処理を基底クラスの中に隠蔽する。 • Ex. PyTorchの `nn.Module`:

    パラメータ管理や最適化機能を提供 2. オブジェクトの仕様・取り扱い⽅を統⼀ • 共通のメソッド・属性を持つことを保証する。 • Ex. ベンダーごとに中⾝の実装は分けたい(ChatGPT, Gemini, Claude, …) でも外部からの取り扱われ⽅(チャット機能)は統⼀したい • → 抽象基底クラスへ
  10. 15 抽象基底クラス • ABCを継承して実装する。 • Abstract Base Class • `@abstractmethod`

    デコレータ • メソッド(インターフェイス)に付与。 • 継承先にその実装を強制させる。 • 実装せずにインスタンス化しようとするとエラー
  11. 16 多重継承: Mixin • Mixinクラス • 基底クラスと⼀緒に継承。 • 機能をさらに注⼊できる。 •

    実際のSystemでの⽤途 • システムの停⽌・再開のイベント呼び出し
  12. 17 ⚠ 継承の危険性 • 機能破壊 • 変数やメソッドの上書き (Pythonにはマングリング機構があるが…) • メソッドに全く異なる振舞いの定義

    • メンテナンスコストの増⼤ • 基底クラスの変更は、その派⽣クラス全てに影響する • 多層の継承はダメ、絶対 • 「ちょっと別のバリエーションが欲しいから…」 ← ❌ Class A Class B(A) Class C(B) 🔧変更! 影響! 不具合! 💥 破壊!
  13. 19 参考⽂献 • オブジェクト指向(OOP)を解説してみる • https://zenn.dev/cloud_ace/articles/29748ac0537c7f • Python3公式ドキュメント: property •

    https://docs.python.org/ja/3.13/library/functions.html#property • Python3公式ドキュメント: 3. データモデル • https://docs.python.org/ja/3/reference/datamodel.html • Python3公式ドキュメント: enum --- 列挙型のサポート • https://docs.python.org/ja/3.13/library/enum.html • Python3公式ドキュメント: 9. クラス • https://docs.python.org/ja/3.13/tutorial/classes.html • abc --- 抽象基底クラス • https://docs.python.org/ja/3.13/library/abc.html
  14. 20 参考⽂献 • マングリング機構について • https://pep8-ja.readthedocs.io/ja/latest/#id37 • Python3: Protocol •

    https://docs.python.org/ja/3.13/library/typing.html#typing.Protocol • PythonにおけるProtocol(ダックタイピング)とABC(抽象化)の違い • https://zenn.dev/ibaraki/articles/bef0b43522475b