Slide 1

Slide 1 text

@ 2023 Novasell, Inc. All Rights Reserved. 5分で理解するPythonのディスクリプタ 2023/10/12 みんなのPython勉強会 LT枠 ノバセル株式会社 ⽥村湧介(tamtam) 1

Slide 2

Slide 2 text

@ 2023 Novasell, Inc. All Rights Reserved. 自己紹介 GitHub: @tamtam-fitness, X: @TamtamFitness, Zenn: Tamtam たむたむ(tamtam)といいます! ラクスル/ノバセルの新卒2年⽬です💪 FastAPIの翻訳/記事の執筆を定期的にしてます🐍

Slide 3

Slide 3 text

@ 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 がデスクリプタであ ればそれぞれのデスクリプタメソッドが呼び出されます。

Slide 4

Slide 4 text

@ 2023 Novasell, Inc. All Rights Reserved. 4 早速試してみる①

Slide 5

Slide 5 text

@ 2023 Novasell, Inc. All Rights Reserved. 5 ディスクリプタプロトコル(__get__など)が       クラスレベルの属性アクセスに適⽤されるようにする 早速試してみる①

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

@ 2023 Novasell, Inc. All Rights Reserved. 7 ディスクリプタの__get__や__set__メソッドが呼び出されるようになるには ディスクリプタオブジェクトがクラスのディクショナリに存在する必要がある。 早速試してみる①: 補⾜

Slide 8

Slide 8 text

@ 2023 Novasell, Inc. All Rights Reserved. 8 早速試してみる① MyClassの属性を呼び出した際に           ディスクリプタプロトコル(__get__など)が呼ばれる

Slide 9

Slide 9 text

@ 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は操作されるオブジェクト。 早速試してみる①

Slide 10

Slide 10 text

@ 2023 Novasell, Inc. All Rights Reserved. 10 早速試してみる② ディスクリプタはインスタンスのディレクトリに 同じ名前の属性があった場合はオーバーライドして実⾏する

Slide 11

Slide 11 text

@ 2023 Novasell, Inc. All Rights Reserved. 11 応⽤例: ORMで使うモデルの属性の実装

Slide 12

Slide 12 text

@ 2023 Novasell, Inc. All Rights Reserved. 12 応⽤例: ORMで使うモデルの属性の実装

Slide 13

Slide 13 text

@ 2023 Novasell, Inc. All Rights Reserved. 13 ディスクリプタはいたる所で使われている! e.g) instance method, @classmethod, @staticmethod, @property, __slots__ の実装 ディスクリプタ HowTo ガイド

Slide 14

Slide 14 text

@ 2023 Novasell, Inc. All Rights Reserved. 14 例:インスタンスメソッドの呼び出し

Slide 15

Slide 15 text

@ 2023 Novasell, Inc. All Rights Reserved. 15 例:インスタンスメソッドの呼び出し

Slide 16

Slide 16 text

@ 2023 Novasell, Inc. All Rights Reserved. 16 例:インスタンスメソッドの呼び出し

Slide 17

Slide 17 text

@ 2023 Novasell, Inc. All Rights Reserved. 17 例:プロパティ

Slide 18

Slide 18 text

@ 2023 Novasell, Inc. All Rights Reserved. 18 例:プロパティ

Slide 19

Slide 19 text

@ 2023 Novasell, Inc. All Rights Reserved. 19 参考 ● Advanced Python Mastery - Section4: Inside Python Objects ● デスクリプタ HowTo ガイド ● Effective Python - 4章 メタクラスと属性 ● Python のディスクリプタ __get__ メソッドってなに? | ⺠主主義に乾杯

Slide 20

Slide 20 text

@ 2023 Novasell, Inc. All Rights Reserved. 20 ご静聴ありがとうございました!