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

Pythonクラス基礎

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for Geson Anko Geson Anko
February 16, 2025
120

 Pythonクラス基礎

Avatar for Geson Anko

Geson Anko

February 16, 2025
Tweet

More Decks by Geson Anko

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