Python类方法装饰W /自我参数?

如何将一个类字段作为parameter passing给一个类方法的装饰器? 我想要做的是这样的:

class Client(object): def __init__(self, url): self.url = url @check_authorization("some_attr", self.url) def get(self): do_work() 

它抱怨自我不存在self.url传递给装饰者。 有没有解决的办法?

是。 在类定义时不要传入实例属性,而是在运行时检查它:

 def check_authorization(f): def wrapper(*args): print args[0].url return f(*args) return wrapper class Client(object): def __init__(self, url): self.url = url @check_authorization def get(self): print 'get' >>> Client('http://www.google.com').get() http://www.google.com get 

装饰器拦截方法参数; 第一个参数是实例,所以它读取的属性。 您可以将属性名称作为string传递给装饰器,如果您不想硬编码属性名称,请使用getattr

 def check_authorization(attribute): def _check_authorization(f): def wrapper(self, *args): print getattr(self, attribute) return f(self, *args) return wrapper return _check_authorization 
 from re import search from functools import wraps def is_match(_lambda, pattern): def wrapper(f): @wraps(f) def wrapped(self, *f_args, **f_kwargs): if callable(_lambda) and search(pattern, (_lambda(self) or '')): f(self, *f_args, **f_kwargs) return wrapped return wrapper class MyTest(object): def __init__(self): self.name = 'foo' self.surname = 'bar' @is_match(lambda x: x.name, 'foo') @is_match(lambda x: x.surname, 'foo') def my_rule(self): print 'my_rule : ok' @is_match(lambda x: x.name, 'foo') @is_match(lambda x: x.surname, 'bar') def my_rule2(self): print 'my_rule2 : ok' test = MyTest() test.my_rule() test.my_rule2() 

input:my_rule2:好的

一个更简洁的例子可能如下:

 #/usr/bin/env python3 from functools import wraps def wrapper(method): @wraps(method) def _impl(self, *method_args, **method_kwargs): return method(self, *method_args, **method_kwargs) + "!" return _impl class Foo: @wrapper def bar(self, word): return word f = Foo() result = f.bar("kitty") print(result) 

哪个会打印:

 kitty! 

你不能。 在课堂上没有self ,因为没有实例存在。 你需要传递它,例如包含属性名称的str来查找实例,然后返回的函数可以执行,或者完全使用不同的方法。