【问题标题】:descriptor behavior difference on class and instance [duplicate]类和实例上的描述符行为差异[重复]
【发布时间】:2018-02-03 20:13:24
【问题描述】:

我正在尝试理解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__ 被正确调用,但在实例属性上却没有调用所需的方法。我尝试阅读this,但目前还不清楚该页面的哪一部分适用于此处。

【问题讨论】:

    标签: python python-3.6 propertydescriptor


    【解决方案1】:

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

    请参阅参考数据模型文档的Invoking Descriptors section

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

    我的大胆强调。这里,owner class是你访问属性的实例的类,或者如果访问类的属性,类本身就是owner class

    【讨论】:

    • 我明白了。你知道这是什么原理吗?为什么我们在 python 中有这些复杂的查找规则? (来自c++背景)
    • @skgbanga:因为描述符是在类型上发现然后绑定到实例的可重用对象。如果您需要更改每个实例的行为,请让描述符根据实例数据更改其行为,不要在实例上设置描述符。那是没有意义的。
    猜你喜欢
    • 2011-10-24
    • 1970-01-01
    • 2018-07-28
    • 2013-05-23
    • 2012-02-10
    • 2012-09-17
    • 2011-03-15
    • 1970-01-01
    相关资源
    最近更新 更多