一、什么是描述符
在Python中实现了__get__/__set__/__delete__魔术方法的类就是描述符,通过描述符我们可以反向控制引用了描述符的类。
如以下的代码所示,在普通的类中,类B引用了类A,类A是不能控制类B。
class A:
pass
class B:
a = A()
B.a
但是,实现了描述符协议的类就不一样了,如以下的代码所示,我们可以通过类A来修改类B的属性。
class A:
def __get__(self, instance, owner):
# owner就是类B
if not owner.test:
owner.test = 'foo' # B.test = 'foo'
def __set__(self, instance, value):
pass
def __delete__(self, instance):
pass
class B:
a = A()
test = None
B.a # 调用描述符会触发了A.__get__函数的调用,并把类B当做参数传进去
print(B.test) # 输出foo
二、实现单例模式
利用描述符反向控制的特点可以实现单例模式,具体代码如下,我们把单例实例化放在描述符类Descriptor的__get__函数来实现,只有触发__get__函数既可以,同时重写Singleton类的_