1

我试图理解python中的描述符,我注意到的一件事是:

In [1]: class descriptor:                  
   ...:     def __init__(self):            
   ...:         pass                       
   ...:     def __get__(self, instance, owner):                                        
   ...:         print ("__get__ called")   
   ...:         return 0                   
   ...:     def __set__(self, obj, value): 
   ...:         print ("__set__ called")   

In [2]: class Foo:                         
   ...:     y = descriptor()               
   ...:     def __init__(self):            
   ...:         self.x = descriptor()      

In [3]: Foo.y                              
__get__ called                             
Out[3]: 0                                  

In [4]: f = Foo()                          

In [5]: f.x                                
Out[5]: <__main__.descriptor at 0x1099dd588>

如您所见,在类属性上,描述符__get__被正确调用,但在实例属性上,它没有调用所需的方法。我尝试阅读内容,但该页面的哪一部分适用于此处并不是很明显。

4

1 回答 1

1

描述符仅在类上受支持,从不在实例上受支持。

请参阅参考数据模型文档的调用描述符部分:

以下方法仅适用于包含该方法的类的实例(所谓的描述符类)出现在所有者类中(描述符必须在所有者的类字典或其父类之一的类字典中)。

大胆强调我的。这里,所有者类是您访问其属性的实例的类,或者在访问类上的属性的情况下,该类本身就是所有者类

于 2018-02-03T20:18:26.560 回答