Python对象。\uu getattribute\uuuu重写后行为不正确

2024-09-30 02:37:00 发布

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

我正在尝试复制mongoengine功能,它允许您定义字段对象,这些字段对象可以像代码中的普通python对象一样使用。 我的想法是创建一个包含值和(反)序列化逻辑的FieldHolder类,以及一个带有重写的__setattr____getattribute__方法的Document对象

在我的代码草稿中,如果我将x.h设置为某个值,那么这个值将被正确地分配给x.h._value。当我得到x.h时,我正确地得到了x.h._value

但是,我也希望将h作为FieldHolder对象,而不是作为其值。我试过使用object.__getattribute__(在serialize方法内部),但仍然得到h._valueobject.__getattribute__(self, 'h')返回abc)。我做错什么了?谢谢

class FieldHolder:

    _value = None
    # Some serialization and deserialization methods


class Document(object):

    h = FieldHolder()

    def __setattr__(self, key, value):
        attr = getattr(self, key, None)
        if attr is not None and isinstance(attr, FieldHolder):
            attr._value = value
        else:
            super().__setattr__(key, value)

    def __getattribute__(self, key):
        val = super().__getattribute__(key)
        if isinstance(val, FieldHolder):
            return val._value
        else:
            return val

    def serialize(self):
        res = {}
        for name, value in vars(self).items():
            obj = object.__getattribute__(self, name)  # not working as expected
            if isinstance(obj, FieldHolder):
                res[name] = value
        return res


x = Document()
x.h = "abc"  # h._value is now "abc"
print(x.h)   # prints "abc"
s = x.serialize() # should return {'h': 'abc'} but returns {}
print(s)

Tags: 对象keyselfnonereturnobjectvalueval

热门问题