Это дает пользователям возможность что-то сделать с классом, который использовался для вызова дескриптора.
В обычных случаях, когда дескриптор вызывается через экземпляр, мы можем получить тип объекта, вызвав 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>
[Документация объекта '.__ get__'] (https://docs.python.org/3.4/reference/datamodel.html?highlight=__get__#object.__get__) не упоминает' objtype'. Откуда вы узнали об этом? –
@ LutzHorn 'owner' является' objtype' в этом случае, то есть классом. –
http://intermediatepythonista.com/classes-and-objects-ii-descriptors –