装饰类的装饰器导致类属性变化
(实在是外行新手,部分措辞可能没有那样专业,我尽量使描述准确。)
我了解到,若使用装饰器修饰一个函数,为了保证“一致性”,会使用functools.wraps修饰装饰器内部的函数(参考官方文档内的例子)
现在我希望装饰一个类,我最初的目的是希望重写被修饰类父类的某个方法,于是我在转饰器内部定义了一个子类并返回它
from functools import wraps
class father():
def something(self):
pass
def decorator_my(cls):
# @wraps(cls)
class wrapped(cls):
def something(self):
print('do something')
return wrapped
@decorator_my
class son(father):
pass
print(son.__name__)
上面代码的运行结果是
wrapped
这是很好理解的,但我希望能得到son.__name__
返回son
,于是我尝试着加入wraps
(取消上述注释),但是失败了
报错为
File "/usr/lib/python3.9/functools.py", line 58, in update_wrapper
getattr(wrapper, attr).update(getattr(wrapped, attr, {}))
AttributeError: 'mappingproxy' object has no attribute 'update'
我现在知道这样的错误是因为类的__dict__
是一种只读的字典(mappingproxy
),那是否有别的方法可以帮助我实现这个目的(例如son.__name__
返回son
)
我的最初目的或许可以通过继承关系来实现,但我仍然希望知道这个有关装饰器问题的正确解决方法
谢谢
推荐文章: