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

みんなのPython勉強会_LT枠_10_12__5分で理解するディスクリプタ.pdf

Yusuke Tamura
October 12, 2023
700

 みんなのPython勉強会_LT枠_10_12__5分で理解するディスクリプタ.pdf

stapy#98のLTで発表した内容になります
https://startpython.connpass.com/event/296755/

Yusuke Tamura

October 12, 2023
Tweet

Transcript

  1. @ 2023 Novasell, Inc. All Rights Reserved. 自己紹介 GitHub: @tamtam-fitness,

    X: @TamtamFitness, Zenn: Tamtam たむたむ(tamtam)といいます! ラクスル/ノバセルの新卒2年⽬です💪 FastAPIの翻訳/記事の執筆を定期的にしてます🐍
  2. @ 2023 Novasell, Inc. All Rights Reserved. 3 ディスクリプタとは __get__(),

    __set__(), __delete__() を1つ以上定義しているオブジェクト 引⽤: descriptor --- Python 3.12.0 ⽤語集 __get__(), __set__(), あるいは __delete__() を定義しているオブジェクトです。あるクラス属性がデスクリプタであるとき、 属性探索によって、束縛されている特別な動作が呼び出されます。 通常、get,set,deleteのために a.b と書くと、 a のクラス辞書内でオブジェクト b を検索しますが、 b がデスクリプタであ ればそれぞれのデスクリプタメソッドが呼び出されます。
  3. @ 2023 Novasell, Inc. All Rights Reserved. 6 早速試してみる①: 補⾜

    Pythonはディクショナリをユーザー定義オブジェクトの    クラス変数やインスタンス変数を管理する際に⽤いる。
  4. @ 2023 Novasell, Inc. All Rights Reserved. 8 早速試してみる① MyClassの属性を呼び出した際に

              ディスクリプタプロトコル(__get__など)が呼ばれる
  5. @ 2023 Novasell, Inc. All Rights Reserved. 9 class Descriptor:

    def __init__(self, name): self.name = name def __get__(self, instance, cls): print(f"{self.name}: __get__") def __set__(self, instance, value): print(f"{self.name}:__set__ {value}") def __delete__(self, instance): print(f"{self.name}:__delete__") obj = MyClass() obj.attribute obj.attribute = "y" del obj.attribute 注意: 第⼀引数で使われるselfはディスクリプタ⾃⾝、第⼆引数のinstanceは操作されるオブジェクト。 早速試してみる①
  6. @ 2023 Novasell, Inc. All Rights Reserved. 13 ディスクリプタはいたる所で使われている! e.g)

    instance method, @classmethod, @staticmethod, @property, __slots__ の実装 ディスクリプタ HowTo ガイド
  7. @ 2023 Novasell, Inc. All Rights Reserved. 19 参考 •

    Advanced Python Mastery - Section4: Inside Python Objects • デスクリプタ HowTo ガイド • Effective Python - 4章 メタクラスと属性 • Python のディスクリプタ __get__ メソッドってなに? | ⺠主主義に乾杯