2015-05-25 2 views
3

Я знаю, что в Python мы должны предоставить функцию __get__ при реализации дескриптора. Интерфейс, как:Каково использование третьего аргумента objtype в дескрипторе Python __get__

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

Мой вопрос:

Почему мы должны поставить objtype ARG? Что такое objtype?

Я не видел примеров использования этого аргумента.

+0

[Документация объекта '.__ get__'] (https://docs.python.org/3.4/reference/datamodel.html?highlight=__get__#object.__get__) не упоминает' objtype'. Откуда вы узнали об этом? –

+1

@ LutzHorn 'owner' является' objtype' в этом случае, то есть классом. –

+0

http://intermediatepythonista.com/classes-and-objects-ii-descriptors –

ответ

0

Из документации object.__get__(self, instance, owner):

owner всегда класс владельца, в то время как instance является экземпляр, что атрибут был доступен через или None когда атрибут доступен через owner.

Так вы не питанияowner, устанавливается в зависимости от того, как __get__ называется.

+0

Знаете ли вы какое-то обстоятельство, в котором используется * владелец *? Я просто не знаю цели этого аргумента. – ruanhao

0

Это дает пользователям возможность что-то сделать с классом, который использовался для вызова дескриптора.

В обычных случаях, когда дескриптор вызывается через экземпляр, мы можем получить тип объекта, вызвав 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> 

 Смежные вопросы

  • Нет связанных вопросов^_^