首页 / PYTHON / python中的类装饰器装饰方法
python中的类装饰器装饰方法
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python中的类装饰器装饰方法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1634字,纯文字阅读大概需要3分钟。
内容图文
![python中的类装饰器装饰方法](/upload/InfoBanner/zyjiaocheng/655/2ae17d8e0e13417c8fab79b8602fb442.jpg)
这个问题已经在这里有了答案: > How can I decorate an instance method with a decorator class? 3个
我正在尝试使用装饰器进行记忆,该装饰器是一个类而不是一个函数,但出现错误
TypeError: seqLength() takes exactly 2 arguments (1 given)
我猜想这与类有关,但是不确定那里出了什么问题.
编码:
import sys
class memoize(object):
'''memoize decorator'''
def __init__(self, func):
self.func = func
self.cache = {}
def __call__(self, *args):
try:
return self.cache[args]
except KeyError:
value = self.func(self, *args)
self.cache[args] = value
return value
class collatz(object):
def __init__(self, n):
self.max = 1
self.n = n
@memoize
def seqLength(self, n):
if n>1:
if n%2 == 0:
return 1+self.seqLength(n/2)
else:
return 1+self.seqLength(3*n+1)
else:
return 1
def maxLength(self):
for n in xrange(1, self.n):
l = self.seqLength(n)
if l > self.max:
self.max = n
return self.max
n = int(sys.argv[1])
c = collatz(n)
print c.maxLength()
解决方法:
装饰器只是foo = decorator(foo)的语法糖,因此在这种情况下,您最终要使seqLength的自身成为备忘录而不是collat??z.您需要使用描述符.该代码对我有用:
class memoize(object):
'''memoize descriptor'''
def __init__(self, func):
self.func = func
def __get__(self, obj, type=None):
return self.memoize_inst(obj, self.func)
class memoize_inst(object):
def __init__(self, inst, fget):
self.inst = inst
self.fget = fget
self.cache = {}
def __call__(self, *args):
# if cache hit, done
if args in self.cache:
return self.cache[args]
# otherwise populate cache and return
self.cache[args] = self.fget(self.inst, *args)
return self.cache[args]
有关描述符的更多信息:
http://docs.python.org/howto/descriptor.html#descriptor-example
内容总结
以上是互联网集市为您收集整理的python中的类装饰器装饰方法全部内容,希望文章能够帮你解决python中的类装饰器装饰方法所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。