def add_base_metadata(func):
def wrapper(*args, **kwargs):
setattr(func, 'metadata', {'version': '1.0'})
return func(*args, **kwargs)
return wrapper
def add_sub_metadata(func):
def wrapper(*args, **kwargs):
base_metadata = getattr(func.__base__,'metadata', {})
new_metadata = {'feature': 'newFeature'}
new_metadata.update(base_metadata)
setattr(func, 'metadata', new_metadata)
return func(*args, **kwargs)
return wrapper
@add_base_metadata
class BaseClass:
pass
@add_sub_metadata
class SubClass(BaseClass):
pass
print(SubClass.metadata)
装饰器执行顺序和元数据传递原理
- 装饰器执行顺序:
- 当定义类时,装饰器从最内层向外层应用。首先
BaseClass
被 add_base_metadata
装饰器装饰,在这个装饰器中,为 BaseClass
添加了 metadata
属性,值为 {'version': '1.0'}
。
- 然后
SubClass
被 add_sub_metadata
装饰器装饰。在这个装饰器中,它先获取 BaseClass
的 metadata
(通过 func.__base__
访问基类),然后添加自己的元数据 {'feature': 'newFeature'}
并更新到 SubClass
的 metadata
属性中。
- 元数据传递原理:
- 在
add_sub_metadata
装饰器中,通过 getattr(func.__base__,'metadata', {})
获取基类 BaseClass
的 metadata
。如果基类没有 metadata
属性,返回空字典。然后将自己的元数据与基类的元数据合并(通过 update
方法),并设置到子类 SubClass
上,从而实现了元数据从基类到子类的传递和扩展。