Python の記述子の詳細な紹介

巴扎黑
リリース: 2017-09-16 10:02:15
オリジナル
1330 人が閲覧しました

この記事は Python の記述子に関する知識を共有するものであり、それを必要とする友人はそれを参照できます。

通常、記述子は「バインディング動作」を持つオブジェクト属性です。バインドされた動作は、記述子プロトコルを介してカスタム __get__() 、 __set__() 、および __delete__() メソッドによってオーバーライドできます。オブジェクトの上記 3 つのメソッドのいずれかがオーバーライドされる場合、それを記述子と呼ぶことができます。

プロパティのデフォルトの操作は、オブジェクト ディクショナリからプロパティを取得、設定、削除することです。たとえば、次のような場合です。検索チェーン内のオブジェクトに記述子メソッドが定義されている場合、Python はデフォルトの動作をオーバーライドします。

Descriptor は強力なツールですが、開発者はあまり触れませんが、実際にはクラス、プロパティ、関数、メソッド、静的メソッド、クラス メソッド、および super() の背後にある操作メカニズムです。

記述子プロトコル

3 つのメソッドのプロトタイプは次のとおりです:

descr.__get__(self, obj, type=None) --> value
descr.__set__(self, obj, value) --> None
descr.__delete__(self, obj) --> None
ログイン後にコピー

データ記述子は、__get__() メソッドと __set__() メソッドの両方を持つオブジェクトです。非データ記述子。インスタンス辞書にデータ記述子と同じ名前のエントリが存在する場合、データ記述子が優先されます。対照的に、非データ記述子の優先順位は低くなります。

__set__() メソッドで例外をスローして、読み取り専用のデータ記述子を作成します。

Call descriptor

descriptorはメソッド名を通じて直接呼び出すことができます。たとえば、 d.__get__(obj) 。

オブジェクトのプロパティにアクセスして記述子を自動的に呼び出す方が一般的です。たとえば、d がメソッド __get__() を定義している場合、obj.d は d.__get__(obj) を呼び出します。

オブジェクトの場合、 b.x は type(b).__dict__['x'].__get__(b, type(b)) に変換されます。また、クラスの場合 (はい、クラスも呼び出すことができます)、 B.x は B.__dict__['x'].__get__(None, B) に変換されます。

記述子の例

class RevealAccess(object):
  """A data descriptor that sets and returns values
    normally and prints a message logging their access.
  """
  def __init__(self, initval=None, name='var'):
    self.val = initval
    self.name = name
  def __get__(self, obj, objtype):
    print('Retrieving', self.name)
    return self.val
  def __set__(self, obj, val):
    print('Updating', self.name)
    self.val = val
>>> class MyClass(object):
...   x = RevealAccess(10, 'var "x"')
...   y = 5
...
>>> m = MyClass()
>>> m.x
Retrieving var "x"
10
>>> m.x = 20
Updating var "x"
>>> m.x
Retrieving var "x"
20
>>> m.y
5
ログイン後にコピー

以上がPython の記述子の詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!