You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现兼具注入父类A与应用behavior装饰器的new_behavior类装饰器?

实现同时注入父类和应用装饰器的类装饰器

完全可以实现这样的类装饰器new_behavior,核心思路是在装饰器内部先修改目标类的继承关系(注入父类A),再将修改后的类传入原有装饰器behavior处理。以下是具体实现和示例:

步骤1:定义基础组件

首先定义基类A和示例装饰器behavior,方便后续测试:

class A:
    def a_method(self):
        print("来自基类A的方法")

def behavior(cls):
    # 给类添加一个属性和方法,模拟装饰器的功能
    cls.behavior_flag = "由behavior装饰器添加的属性"
    def behavior_func(self):
        print("来自behavior装饰器的方法")
    cls.behavior_func = behavior_func
    return cls

步骤2:实现new_behavior装饰器

这个装饰器会完成两件事:给目标类注入父类A,再应用behavior装饰器:

def new_behavior(cls):
    # 动态生成新类:保留原类名称、继承A+原类的父类、复制原类所有属性
    # 用原类的元类创建,兼容自定义元类场景
    metaclass = type(cls)
    enhanced_class = metaclass(
        cls.__name__,
        (A,) + cls.__bases__,
        dict(cls.__dict__)
    )
    # 对增强后的类应用behavior装饰器
    return behavior(enhanced_class)

步骤3:测试效果

用@new_behavior装饰类B,验证是否同时具备继承A和behavior的特性:

@new_behavior
class B:
    def b_method(self):
        print("来自类B的方法")

# 验证继承关系
b_instance = B()
print(isinstance(b_instance, A))  # 输出: True
b_instance.a_method()  # 输出: 来自基类A的方法

# 验证behavior装饰器的效果
print(b_instance.behavior_flag)  # 输出: 由behavior装饰器添加的属性
b_instance.behavior_func()  # 输出: 来自behavior装饰器的方法

# 验证原类自身方法正常工作
b_instance.b_method()  # 输出: 来自类B的方法

原理说明

  • 用type(cls)获取原类的元类,确保新生成的类兼容原类的元类规则(比如自定义元类的场景)。
  • (A,) + cls.__bases__将A添加到原类的父类列表最前面,保证继承优先级符合预期。
  • 复制原类的__dict__属性,保留原类的所有方法、属性和特殊成员。
  • 最后将增强后的类传入behavior装饰器,完成装饰逻辑。

内容的提问来源于stack exchange,提问作者Tâmer Cuba

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 13:03:21