Python对象。__getattribute__在覆盖后无法正确运行

时间:2019-04-08 15:33:01

标签: python python-3.x mongoengine

我正在尝试复制mongoengine功能,该功能可让您定义可以像代码中的普通python对象一样使用的字段对象。 我的想法是创建一个包含值和(反)序列化逻辑的FieldHolder类,以及一个带有覆盖的Document__setattr__方法的__getattribute__对象。

在我的代码草稿中,如果我将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)

0 个答案:

没有答案