我正在尝试复制mongoengine功能,它允许您定义字段对象,这些字段对象可以像代码中的普通python对象一样使用。
我的想法是创建一个包含值和(反)序列化逻辑的FieldHolder
类,以及一个带有重写的__setattr__
和__getattribute__
方法的Document
对象
在我的代码草稿中,如果我将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)
目前没有回答
相关问题 更多 >
编程相关推荐