我知道在Python中我们必须在实现描述符时提供__get__
函数。界面如下:
def __get__(self, obj, objtype=None):
pass
我的问题是:
为什么我们必须提供objtype
arg? objtype
用于什么?
我没有看到关于这个arg使用的一些例子。
答案 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__
的调用方式。