在 Python 中,要使用装饰器重写类的方法,需要在装饰器中定义一个新的方法,并将原始方法的调用转移到新的方法上。以下是一个示例代码,演示如何使用装饰器重写类的方法:
def log_getattribute(cls):
# 获取原始的方法
orig_getattribute = cls.getattribute
def new_getattribute(self, name):
print('getting:', name)
return orig_getattribute(self, name)
# 将新的方法附加到类上,并返回类对象
cls.__getattribute__ = new_getattribute
return cls
# 使用示例
@log_getattribute
class A:
def __init__(self, x):
self.x = x
def spam(self):
pass
a = A(42)
# 打印'getting: x'
a.x
# 打印'getting: spam'
a.spam()
在上述代码中,首先定义了一个装饰器函数log_getattribute
,它接受一个类对象作为参数。在装饰器函数内部,获取了原始的__getattribute__
方法,并定义了一个新的__getattribute__
方法new_getattribute
。新的方法在调用原始方法之前和之后打印出方法的名称。然后,将新的方法附加到类上,覆盖原来的__getattribute__
方法。最后,返回类对象。
在示例中,创建了一个名为A
的类,并将其使用@log_getattribute
装饰器进行装饰。这样,当我们调用a.x
或a.spam
时,会看到相应的打印信息。