在 class 中使用装饰器
Using decorators inside a class
我正在尝试在我的应用程序中实现一个简单的日志记录功能。
class messages(object):
# Implement decorator here
def on(self):
def wrapper():
# Do something here
return wrapper
def off(self):
def wrapper():
# Do something here
return wrapper
class website(object):
@messages.on #This line can be switched on/off
def login(self):
# Do a whole bunch of stuff here
self.response = "[+] Login Succeeded!"
website = website()
website.login() # prints self.response based on @messages.on/off
但我不确定我需要在装饰器中应用什么。我曾尝试创建实例并添加参数,但大多收到 TypeError。我对装饰者还很陌生。任何帮助将不胜感激,我很乐意下次记住这一点。
以下是您可以使用的示例装饰器:
class Utilities:
@staticmethod
def add_logger(func):
def wrapped_func(*args, **kwargs):
# Sample logic, feel free to update this
try:
func_response = func(*args, **kwargs)
except:
print 'I am error handled by logger'
func_response = None
return func_response
return wrapped_func
现在让我们定义您的 class:
class Dog(object):
@Utilities.add_logger
def bark(self):
print 'In bark'
@Utilities.add_logger
def my_error_function(self):
print 'In my_error_function'
raise Exception # <--- Raises Exception
现在,让我们看看它是如何工作的:
>>> dog = Dog()
>>> dog.bark()
In bark
>>> dog.my_error_function()
In my_error_function
I am error handled by logger # Content from logger in case of exception
注意: 你真的不应该在这里创建一个 class
来存储效用函数。创建一个单独的实用程序文件并在那里编写这样的功能。
没有 class,你的装饰器应该是这样的(假设在 utility.py):
def add_logger(func):
def wrapped_func(*args, **kwargs):
# Sample logic, feel free to update this
try:
func_response = func(*args, **kwargs)
except:
print 'I am error handled by logger'
func_response = None
return func_response
return wrapped_func
要使用它,只需执行以下操作:
import utility
class Dog(object):
@utility.add_logger
def bark(self):
print 'In bark'
如果你只是想让 Dog 吠叫(如示例中所示),则无需启用装饰器
class Dog(object):
def __init__(self):
self.sound = "Woof!"
def bark(self):
return self.sound
如果您想为 class 中的某些功能启用日志记录,这里有一段代码可以做到这一点,并在注释中进行解释
from functools import wraps
class Utilities(object):
@staticmethod # no default first argument in logger function
def logger(f): # accepts a function
@wraps(f) # good practice https://docs.python.org/2/library/functools.html#functools.wraps
def wrapper(self, *args, **kwargs): # explicit self, which means this decorator better be used inside classes only
print("Before:", self.sound)
result = f(self, *args, **kwargs)
print("After:", self.sound)
return result
return wrapper
class Dog(object):
def __init__(self):
self.sound = "Woof!"
@Utilities.logger
def run(self):
"""Perform running movement"""
print("Running")
示例:
>>> dog = Dog()
>>> dog.run()
Before: Woof!
Running
After: Woof!
虽然毕竟没有必要在 Utilities
class 中存储装饰器功能 - 最好有一个名为 utils
的单独模块(文件)并将装饰器放在那里作为一个独立的功能
我正在尝试在我的应用程序中实现一个简单的日志记录功能。
class messages(object):
# Implement decorator here
def on(self):
def wrapper():
# Do something here
return wrapper
def off(self):
def wrapper():
# Do something here
return wrapper
class website(object):
@messages.on #This line can be switched on/off
def login(self):
# Do a whole bunch of stuff here
self.response = "[+] Login Succeeded!"
website = website()
website.login() # prints self.response based on @messages.on/off
但我不确定我需要在装饰器中应用什么。我曾尝试创建实例并添加参数,但大多收到 TypeError。我对装饰者还很陌生。任何帮助将不胜感激,我很乐意下次记住这一点。
以下是您可以使用的示例装饰器:
class Utilities:
@staticmethod
def add_logger(func):
def wrapped_func(*args, **kwargs):
# Sample logic, feel free to update this
try:
func_response = func(*args, **kwargs)
except:
print 'I am error handled by logger'
func_response = None
return func_response
return wrapped_func
现在让我们定义您的 class:
class Dog(object):
@Utilities.add_logger
def bark(self):
print 'In bark'
@Utilities.add_logger
def my_error_function(self):
print 'In my_error_function'
raise Exception # <--- Raises Exception
现在,让我们看看它是如何工作的:
>>> dog = Dog()
>>> dog.bark()
In bark
>>> dog.my_error_function()
In my_error_function
I am error handled by logger # Content from logger in case of exception
注意: 你真的不应该在这里创建一个 class
来存储效用函数。创建一个单独的实用程序文件并在那里编写这样的功能。
没有 class,你的装饰器应该是这样的(假设在 utility.py):
def add_logger(func):
def wrapped_func(*args, **kwargs):
# Sample logic, feel free to update this
try:
func_response = func(*args, **kwargs)
except:
print 'I am error handled by logger'
func_response = None
return func_response
return wrapped_func
要使用它,只需执行以下操作:
import utility
class Dog(object):
@utility.add_logger
def bark(self):
print 'In bark'
如果你只是想让 Dog 吠叫(如示例中所示),则无需启用装饰器
class Dog(object): def __init__(self): self.sound = "Woof!" def bark(self): return self.sound
如果您想为 class 中的某些功能启用日志记录,这里有一段代码可以做到这一点,并在注释中进行解释
from functools import wraps class Utilities(object): @staticmethod # no default first argument in logger function def logger(f): # accepts a function @wraps(f) # good practice https://docs.python.org/2/library/functools.html#functools.wraps def wrapper(self, *args, **kwargs): # explicit self, which means this decorator better be used inside classes only print("Before:", self.sound) result = f(self, *args, **kwargs) print("After:", self.sound) return result return wrapper class Dog(object): def __init__(self): self.sound = "Woof!" @Utilities.logger def run(self): """Perform running movement""" print("Running")
示例:
>>> dog = Dog()
>>> dog.run()
Before: Woof!
Running
After: Woof!
虽然毕竟没有必要在 Utilities
class 中存储装饰器功能 - 最好有一个名为 utils
的单独模块(文件)并将装饰器放在那里作为一个独立的功能