Нужна помощь в понимании фрагмента кода с декораторами и дескрипторами классов

import collections
import functools

class memoized(object):
   '''Decorator. Caches a function's return value each time it is called.
   If called later with the same arguments, the cached value is returned
   (not reevaluated).
   '''
   def __init__(self, func):
      self.func = func
      self.cache = {}

   def __call__(self, *args):
      if not isinstance(args, collections.Hashable):
         # uncacheable. a list, for instance.
         # better to not cache than blow up.
         return self.func(*args)
      if args in self.cache:
         return self.cache[args]
      else:
         value = self.func(*args)
         self.cache[args] = value
         return value

   def __repr__(self):
      '''Return the function's docstring.'''
      return self.func.__doc__

   def __get__(self, obj, objtype):
      '''Support instance methods.'''
      return functools.partial(self.__call__, obj)

# simple class just to test
class Fib(object):

   @memoized
   def fibonacci(self, n):
      '''Return the nth fibonacci number.'''
      if n in (0, 1):
         return n
      return self.fibonacci(n-1) + self.fibonacci(n-2)

У меня проблемы с пониманием того, как здесь работает дескриптор get. Я знаю, что он там для поддержки методов экземпляра, потому что memoized не знает, на что здесь ссылается self, но я не знаю, как он решает проблему под капотом? как здесь вообще звонят?


person Micheal    schedule 25.01.2017    source источник
comment
Вы читали HOWTO по дескриптору Python? Что из этого было непонятно?   -  person Martijn Pieters    schedule 25.01.2017
comment
И не имеет отношения к этому: тест isinstance(args, collections.Hashable) никогда не завершится ошибкой, потому что args всегда является кортежем. Однако хеширование может по-прежнему завершаться ошибкой, если какой-либо из аргументов сам по себе не может быть хеширован. isinstance(([],), collections.Hashable) верно, но hash([]) вызывает исключение.   -  person Martijn Pieters    schedule 25.01.2017
comment
@Martijn я знаю, как работает get и почему мы его используем здесь, но я не знаю, как он решает нашу проблему.   -  person Micheal    schedule 25.01.2017
comment
Пробовали ли вы удалить метод __get__, чтобы посмотреть, что произойдет?   -  person Martijn Pieters    schedule 25.01.2017
comment
@MartijnPieters да, у меня это не получается из-за «я», и это имеет смысл, мой вопрос в том, когда и как здесь вызывается get   -  person Micheal    schedule 25.01.2017
comment
Вот почему я связался с дескриптором как. Прочтите это.   -  person Martijn Pieters    schedule 25.01.2017
comment
@MartijnPieters спасибо, эта ссылка действительно помогла, теперь я начну читать документы, а не другие источники :)   -  person Micheal    schedule 25.01.2017