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

如何为继承其他类的类编写装饰器?解决TypeError报错

解决类装饰器继承时的TypeError问题

错误原因

你编写的装饰器返回的是函数(wrapper)而非类。当装饰器作用在类A后,A实际被替换成了这个wrapper函数,不再是类类型。子类B尝试继承A时,Python会把函数当作父类处理,但函数无法作为类的继承对象,因此触发TypeError: function() argument 'code' must be code, not str错误。

解决方案

调整装饰器逻辑,让它返回一个继承原类的新类,而非函数。这样既能保留原类的所有特性,支持继承,又能实现打印创建时间的需求。

修改后的完整代码:

import datetime

def createtime(cls):
    class WrappedClass(cls):
        def __init__(self, *args, **kwargs):
            # 先执行父类的初始化逻辑
            super().__init__(*args, **kwargs)
            # 打印实例创建时间
            print('Creatime is', datetime.now())
    return WrappedClass

@createtime
class A:
    pass

@createtime 
class B(A):
    pass

代码说明

  • 装饰器createtime内部定义了新类WrappedClass,它直接继承自传入的原类cls,完全保留原类的属性和方法
  • 重写__init__方法,通过super()调用父类的初始化逻辑,再追加打印创建时间的操作
  • 最终返回这个新类,确保被装饰后的A和B仍然是类类型,子类继承时能正常触发Python的继承机制

内容的提问来源于stack exchange,提问作者Viking099

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 19:24:10