Python描述符__get__中第三个参数objtype的用法是什么

时间:2015-05-25 08:34:23

标签: python descriptor

我知道在Python中我们必须在实现描述符时提供__get__函数。界面如下:

def __get__(self, obj, objtype=None):
    pass

我的问题是:

为什么我们必须提供objtype arg? objtype用于什么?

我没有看到关于这个arg使用的一些例子。

2 个答案:

答案 0 :(得分:1)

它为用户提供了一个选项,可以使用用于调用描述符的类来执行某些操作。

在通过实例调用描述符的正常情况下,我们可以通过调用type(ins)来获取对象类型。

但是当通过类ins调用它时将None,如果第三个参数不存在,我们将无法访问类对象。

以Python中的函数为例,每个函数都是types.FunctionType的一个实例,并且有__get__ method可用于使该函数成为绑定或未绑定的方法。

>>> from types import FunctionType
>>> class A(object):
    pass
...
>>> def func(self):
    print self
...
>>> ins = A()
>>> types.FunctionType.__get__(func, ins, A)() # instance passed
<__main__.A object at 0x10f07a150>
>>> types.FunctionType.__get__(func, None, A)  # instance not passed
<unbound method A.func>
>>> types.FunctionType.__get__(func, None, A)()
Traceback (most recent call last):
  File "<ipython-input-211-d02d994cdf6b>", line 1, in <module>
    types.FunctionType.__get__(func, None, A)()
TypeError: unbound method func() must be called with A instance as first argument (got nothing instead)
>>> types.FunctionType.__get__(func, None, A)(A())
<__main__.A object at 0x10df1f6d0>

答案 1 :(得分:0)

来自object.__get__(self, instance, owner)的文档:

  

owner始终是所有者类,而instance是访问该属性的实例,或None通过owner访问该属性时。 / p>

所以你不提供 owner,它的设置取决于__get__的调用方式。