如何为继承其他类的类编写装饰器?解决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
相关产品推荐
相关产品推荐

