1. ホーム
  2. パイソン

[解決済み】__get__と__set__とPythonディスクリプタの理解

2022-03-25 09:05:18

質問

私は 試行錯誤 Pythonの記述子とは何か、そしてそれが何のために有用なのかを理解するために。どのように機能するかは理解していますが、ここで疑問があります。次のコードを考えてみましょう。

class Celsius(object):
    def __init__(self, value=0.0):
        self.value = float(value)
    def __get__(self, instance, owner):
        return self.value
    def __set__(self, instance, value):
        self.value = float(value)


class Temperature(object):
    celsius = Celsius()

  1. なぜ記述子クラスが必要なのですか?

  2. とは何ですか? instanceowner ここで?は __get__ ). これらのパラメーターの目的は何ですか?

  3. この例をどのように呼び出す/使用するのでしょうか?

どのように解決するのですか?

記述子は、どのようにPythonの property 型が実装されています。ディスクリプタは、単純に __get__ , __set__ などを定義して、別のクラスに追加します (上記の Temperature クラスの場合と同様です)。例えば

temp=Temperature()
temp.celsius #calls celsius.__get__

ディスクリプターを割り当てたプロパティにアクセスする ( celsius は、適切なディスクリプタ・メソッドを呼び出します。

instance__get__ は、そのクラスのインスタンスです(だから、上記。 __get__ を受け取ることになります。 temp 一方 owner は記述子を持つクラス(だから Temperature ).

記述子クラスを使用して、その動力源となるロジックをカプセル化する必要があります。そうすれば、記述子が何らかの高価な操作のキャッシュに使用される場合(たとえば)、そのクラスではなく自分自身に値を格納することができます。

ディスクリプタに関する記事はこちら こちら .

EDIT: jchlさんがコメントで指摘されているように、単純に Temperature.celsius , instance になります。 None .