类方法装饰器为面向对象编程增添了新的维度,允许对类方法的行为进行统一修改和增强 ,而不直接修改类本身。本章深入探究类方法装饰器的原理及其应用。
8.1 装饰类方法原理
类方法装饰器本质上是一个接收类方法作为参数的函数 ,它返回一个替代的或增强后的函数。关键在于理解装饰器如何作用于classmethod和staticmethod,以及普通实例方法。
def log_method_call(method):
def wrapper(self, *args, **kwargs):
print(f"Calling {method.__name__} with args={args}, kwargs={kwargs}")
return method(self, *args, **kwargs)
return wrapper
class MyClass:
@log_method_call
def instance_method(self, message):
print(f"Instance method says: {message}")
@classmethod
@log_method_call
def class_method(cls, msg):
print(f"Class method says: {msg}")
my_obj = MyClass()
my_obj.instance_method("Hello")
MyClass.class_method("Goodbye")
这里,log_method_call装饰器在每个方法调用前后打印日志 ,展示了其工作原理。
8.2 类装饰器与实例方法
应用于实例方法的装饰器,像上例中的instance_method,会在每次实例方法调用时执行装饰器内的逻辑。装饰器可以访问实例的属性(通过self),并且能够影响或监视方法的执行过程。
8.3 类装饰器的高级应用
类装饰器的高级应用包括但不限于自动验证、性能监控、事务管理、日志记录等。例如,通过动态添加事务管理可以确保方法的原子性:
from contextlib import contextmanager
@contextmanager
def transaction():
print("Starting transaction")
try:
yield
except Exception:
print("Rollback")
raise
else:
print("Commit")
def transaction_decorator(method):
@wraps(method)
def wrapper(self, *args, **kwargs):
with transaction():
return method(self, *args, **kwargs)
return wrapper
class BankAccount:
@transaction_decorator
def withdraw(self, amount):
if self.balance >= amount:
self.balance -= amount
print(f"Withdrew {amount}. New balance: {self.balance}")
else:
raise ValueError("Insufficient funds")
account = BankAccount()
account.balance = 100
account.withdraw(50)
通过transaction_decorator,withdraw方法被自动置于事务上下文中 ,增加了代码的健壮性和可维护性。类方法装饰器因此成为了增强代码功能、提高代码质量和开发效率的强大工具。