装饰器放在外面,在inner函数中预设好self参数
def wrap(func):
def inner(self, *args, **kwargs):
print(id(self))
return func(self, *args, **kwargs)
return inner
class A(object):
@wrap
def run(self):
pass
if __name__ == '__main__':
a = A()
print(id(a))
res = a.run()
带参装饰器
def group(name):
def wrap(func):
def inner(self, *args, **kwargs):
print(id(self))
self.role = name
return func(self, *args, **kwargs)
return inner
return wrap
class A(object):
def __init__(self):
self.role = False
@group("Student")
def run(self):
pass
if __name__ == '__main__':
a = A()
print(id(a))
print(a.role)
res = a.run()
print(a.role)
结果
1930845716880
False
1930845716880
Student
类方法作为装饰器
class App:
def __init__(self):
self.requests_times = 0
def route(self, name):
self.requests_times += 1
def wrap(func):
def inner(_self, *args, **kwargs):
print(id(_self))
_self.role = name
return func(_self, *args, **kwargs)
return inner
return wrap
app = App()
class A(object):
def __init__(self):
self.role = False
@app.route("Teacher")
def run(self):
pass
if __name__ == '__main__':
a = A()
print(id(a))
print(a.role)
res = a.run()
print(a.role)
print(app.requests_times)
结果
2179060134432
False
2179060134432
Teacher
1