最近看到一些人写的文章里有提到python的描述符__get__,__set__,__del__. 这里我也小小研究了一下,除了这3个之外还加上过程中学习的几个,比如__call__等。
__get__
object.__get__(self, instance, owner)
如果一个class定义了__get__,那么它就是一个descriptor。其中的参数instance是访问descriptor的实例,owner是所有者的类。如果不是通过实例而是通过类来访问
那么instance就为None。
比如下面的例子:
class simpleDescriptor(object): def __get__(self,instance,owner): print "call __get__" return instance,owner class A(object): foo=simpleDescriptor() print A.foo # None a=A() print a.foo # <__main__.A object at 0x02A299F0>
输出:
call __get__
(None, <class '__main__.A'>)
call __get__
(<__main__.A object at 0x02A698F0>, <class '__main__.A'>)
descriptor自己的实例自己访问自己是不会触发__get__,而会触发__call__,只有descriptor作为其它类的属性才有意义。比如下面的代码:
class simpleDescriptor(object): def __get__(self,instance,owner): print "call __get__" return instance def __call__(self,value): return value class A(object): foo=simpleDescriptor() s=simpleDescriptor() print s #不会调用__get__ print s(10) # 10
输出:
<__main__.simpleDescriptor object at 0x02B49A30>
10
未完待续。。。。