我正在尝试复制mongoengine功能,该功能可让您定义可以像代码中的普通python对象一样使用的字段对象。
我的想法是创建一个包含值和(反)序列化逻辑的FieldHolder
类,以及一个带有覆盖的Document
和__setattr__
方法的__getattribute__
对象。
在我的代码草稿中,如果我将x.h
设置为某个值,则会将该值正确分配给x.h._value
。当我得到x.h
时,我正确地得到了x.h._value
。
但是,我也想将h
作为FieldHolder
对象而不是其值。我尝试使用object.__getattribute__
(在serialize
方法内部),但仍然得到h._value
(object.__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)