需要帮助理解一个带有类装饰器和描述符的代码

时间:2017-01-25 15:07:26

标签: python decorator descriptor

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不知道自己在这里指的是什么,但我不知道它如何解决引擎盖下的问题?如何在这里得到调用?

0 个答案:

没有答案