复制内置类问题:自定义类复制函数处理type类时触发类型错误
解决处理
type类时class_operator函数的报错问题 你的class_operator函数在处理普通类时正常,但遇到type本身就触发TypeError,核心原因是**type作为Python的元类,它的__qualname__属性不是直接的字符串,而是一个getset_descriptor描述符对象**,直接把它传给type()构造器就会因为类型不匹配报错。
问题根源
普通用户自定义类的__qualname__是存储在类命名空间里的字符串,直接访问cls.__qualname__就能拿到正确值。但type作为Python内置的元类,它的部分属性(包括__qualname__)是通过描述符实现的——直接访问type.__qualname__得到的是描述符对象,而非实际的字符串"type",这就导致type()构造器接收了错误类型的参数。
修复方案
我们需要用getattr()来获取__qualname__的实际值,getattr()会触发描述符的__get__方法,返回真正的字符串。修改后的代码如下:
def class_operator(cls): namespace = dict(vars(cls)) # 用getattr正确获取__qualname__,兼容元类情况 qualname = getattr(cls, '__qualname__') # 这里保留你的命名空间修改逻辑 # ... return type(qualname, cls.__bases__, namespace)
验证效果
现在调用class_operator(type)就不会报错了,它会返回一个基于type创建的新类,和处理普通类的逻辑保持一致。
内容的提问来源于stack exchange,提问作者Azat Ibrakov
相关产品推荐
相关产品推荐

