复合模式和装饰模式之间有什么区别?
我想写一个python类,它使用需要实例状态信息的装饰器函数。 这是按预期工作,但如果我明确地使装饰器staticmetod,我得到以下错误: Traceback (most recent call last): File "tford.py", line 1, in <module> class TFord(object): File "tford.py", line 14, in TFord @ensure_black TypeError: 'staticmethod' object is not callable 为什么? 这里是代码: class TFord(object): def __init__(self, color): self.color = color @staticmethod def ensure_black(func): def _aux(self, *args, **kwargs): if self.color == 'black': return func(*args, **kwargs) else: return None […]
使用docstrings与装饰器有问题。 给出以下示例: def decorator(f): def _decorator(): print 'decorator active' f() return _decorator @decorator def foo(): '''the magic foo function''' print 'this is function foo' help(foo) 现在的帮助并没有像预期的那样给我显示foo的文档,它显示: Help on function _decorator in module __main__: _decorator() 没有装饰者,帮助是正确的: Help on function foo in module __main__: foo() the magic foo function 我知道,函数foo是由装饰器包装的,所以函数对象不再是函数foo了。 但是,如何获得文档string(和帮助)是一个很好的解决scheme?
我正在尝试为Django写一个“仅用于人员”的装饰器,但似乎无法使其工作: def staff_only(error='Only staff may view this page.'): def _dec(view_func): def _view(request, *args, **kwargs): u = request.user if u.is_authenticated() and u.is_staff: return view_func(request, *args, **kwargs) messages.error(request, error) return HttpResponseRedirect(request.META.get('HTTP_REFERER', reverse('home'))) _view.__name__ = view_func.__name__ _view.__dict__ = view_func.__dict__ _view.__doc__ = view_func.__doc__ return _view return _dec 试图从这里领先 。 我越来越: 'WSGIRequest' object has no attribute '__name__' 但是,如果我把这3条线,我只是得到一个无用的“内部服务器错误”。 我在这里做错了什么?
我试图限制访问使用2个用户级别的页面。 超级用户和pipe理员。 超级用户是分配“is_superuser”的普通Django用户。 pipe理员用户也是只有“is_staff”权限的普通用户。 问题是,当我使用这个装饰pipe理员用户,它不通过testing: @permission_required('is_staff') def my_view(….) @permission_required('is_staff')为匿名用户返回false。 (正确) @permission_required('is_superuser')只对超级用户返回true(正确) @permission_required('is_staff')返回“is_staff”perm分配给用户的FALSE。 (错误)。 有什么想法吗?
我试图装饰一个类中的方法,但Python是抛出一个错误。 我的课堂看起来像这样: from pageutils import formatHeader myPage(object): def __init__(self): self.PageName = '' def createPage(self): pageHeader = self.createHeader() @formatHeader #<—– decorator def createHeader(self): return "Page Header ",self.PageName if __name__=="__main__": page = myPage() page.PageName = 'My Page' page.createPage() #——- pageutils.py ——————– def formatHeader(fn): def wrapped(): return '<div class="page_header">'+fn()+'</div>' return wrapped Python引发以下错误 self.createHeader() TypeError:wrapped()不带参数(给出1) 我在哪里去打瞌睡?
假设我有以下几点: def with_connection(f): def decorated(*args, **kwargs): f(get_connection(…), *args, **kwargs) return decorated @with_connection def spam(connection): # Do something 我想testingspamfunction,而不用经历设置连接的麻烦(或者装饰者正在做的事情)。 鉴于spam ,我如何从它剥离装饰,并获得底层“未修饰”的function?
我知道@staticmethod,@classmethod和@property,但只能通过分散的文档。 是否有一个内置于Python的函数装饰器的完整列表?
我需要将例程标记为已弃用,但显然不存在用于弃用的标准库装饰器。 我知道它的食谱和警告模块,但我的问题是:为什么没有这个(普通)任务的标准库装饰器? 附加问题:标准库中是否有标准的装饰器?
当使用类定义装饰器时,如何自动传输__name__ , __module__和__doc__ ? 通常,我会使用functools的@wrap装饰器。 下面是我为一个类而做的(这不完全是我的代码): class memoized: """Decorator that caches a function's return value each time it is called. If called later with the same arguments, the cached value is returned, and not re-evaluated. """ def __init__(self, func): super().__init__() self.func = func self.cache = {} def __call__(self, *args): try: return self.cache[args] except KeyError: value […]