gpt4 book ai didi

python - 动态创建一个派生自 ABC 类的类

转载 作者:可可西里 更新时间:2023-11-01 10:36:27 24 4
gpt4 key购买 nike

我正在使用 PyMongo 自定义 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.html http://api.mongodb.com/python/current/examples/custom_type.html#custom-type-type-codec

最佳答案

我认为你误解了 isinstance 的作用。

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

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

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

关于python - 动态创建一个派生自 ABC 类的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56357274/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com