动态创建从ABC类派生的类

2024-10-04 11:35:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用Pymango自定义bson编码器。因为编码器不能被继承,所以需要为每个类创建它,所以我想动态地为它创建一个编码器

问题是基本编码器(TypeEncoder)是从ABC类创建的。当我尝试使用以下代码创建类时:

from bson.codec_options import TypeEncoder

cls_encoder = type(f"Flag{cls.__name__}Encoder", 
                   (TypeEncoder,),
                   {"transform_python": lambda self, value: value.code,
                    "python_type": property(lambda self: cls)})

结果将是

>> isinstance(cls_encoder, TypeEncoder)
False
>> type(cls_encoder)
<class 'abc.FlagAutoReplyContentTypeEncoder'>
>> super(cls_encoder)
<super: <class 'FlagAutoReplyContentTypeEncoder'>, NULL>

预期结果应该是

>> isinstance(cls_encoder, TypeEncoder)
True

注意:cls变量将是一个枚举 注:python_type是一个abstractpropertytransform_python是一个函数,它接受python_type类型的值并返回type is valid for bson serialization类型的值


我试过这个:

class FlagBsonEncoder(TypeEncoder):
    def transform_python(self, value):
        return value.code

cls_encoder = type(f"Flag{cls.__name__}Encoder", 
                   (FlagBsonEncoder,),
                   {"python_type": property(lambda self: cls)})

但结果还是一样:

>> isinstance(cls_encoder, TypeEncoder)
False

下面是如何使用自定义类型编码的官方示例: http://api.mongodb.com/python/current/api/bson/codec_options.htmlhttp://api.mongodb.com/python/current/examples/custom_type.html#custom-type-type-codec


Tags: lambdaselfapi类型encodervaluetype编码器
1条回答
网友
1楼 · 发布于 2024-10-04 11:35:13

我想你误解了isinstance的作用

isinstance(cls_encoder, TypeEncoder)询问类对象cls_encoder是否是TypeEncoder的实例。当然不是-它是一种类型

您想要的是isinstance(cls_encoder(), TypeEncoder),它询问cls_encoder的实例是否也是TypeEncoder的实例,当然这必须是真的

如果要检查类cls_encoder是否是TypeEncoder子类,可以使用issubclass(cls_encoder, TypeEncoder)

相关问题 更多 >