Pythonの記述子
3つの質問に答えます.説明は何ですか.どのように実現しますか?シーンを使用しますか?
一、記述子とは
記述子は、記述子プロトコルのメソッドによって上書きされるバインド動作を持つオブジェクト属性です.これらの方法は、
二、記述子の実現方式
2.1クラスベースの作成
2.2 propety()関数の使用
2.3@property装飾器の使用
三、記述子の使用シーン記述子の使用を組み合わせることで、優雅なプログラミングを実現することができ、SettersとGetters、および読み取り専用属性 を作成することができる.値またはタイプ要求に従って属性検証 を行う.は、Djangoのmodels のような様々なフレームワークに多く使用されている.
一、記述子とは
記述子は、記述子プロトコルのメソッドによって上書きされるバインド動作を持つオブジェクト属性です.これらの方法は、
__get__
、__set__
、および__delete__
である.これらのメソッドのいずれかがオブジェクトに対して定義されている場合、記述子とみなされます.__get__
は、属性にアクセスするために使用されます.属性の値を返すか、要求された属性が存在しない場合にAttributeError
の例外が発生します.__set__
は、属性割り当て操作において呼び出される.何も返さない__delete__
は削除操作を制御する.コンテンツは返されません二、記述子の実現方式
2.1クラスベースの作成
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# __author__ = 'liao gao xiang'
class Descriptor(object):
""""""
def __init__(self):
self._name = ''
def __get__(self, instance, owner):
print("__get__")
return self._name
def __set__(self, instance, value):
print("__set__")
self._name = value
def __delete__(self, instance):
print("__delete__")
del self._name
class Person(object):
name = Descriptor()
p = Person()
print(p.name)
p.name = 'liao gao xiang'
del p.name
# print(p.name)
2.2 propety()関数の使用
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# __author__ = 'liao gao xiang'
class Person(object):
def __init__(self):
self._name = ''
def fget(self):
print("Getting: %s" % self._name)
return self._name
def fset(self, value):
print("Setting: %s" % value)
self._name = value.title()
def fdel(self):
print("Deleting: %s" % self._name)
del self._name
name = property(fget, fset, fdel, "I'm the property.")
p = Person()
print(p.name)
p.name = 'liao gao xiang'
del p.name
# print(p.name)
2.3@property装飾器の使用
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# __author__ = 'liao gao xiang'
class Person(object):
""""""
def __init__(self, name):
self._name = name
@property
def name(self):
print("get_name")
return self._name
@name.setter
def name(self, value):
print("set_name")
self._name = value
@name.deleter
def name(self):
print("del_name")
del self._name
p = Person()
print(p.name)
p.name = 'liao gao xiang'
del p.name
# print(p.name)
三、記述子の使用シーン