我正在将__dict__
序列化到mongo,但我想拦截设置
laden
t.如何在不将属性重命名为的情况下执行该操作
_laden
以便将属性与setter一起使用?你知道吗
我知道我可以用property
替换现有的laden
属性,并以这种方式使用setter:
def Swallow:
def __init__(self):
self._laden = None
@property
def laden(self):
return self._laden
@laden.setter
def laden(self, laden):
updated = some_new_code(laden)
self._laden = updated
但这意味着序列化__dict__
会将名称_laden
存储在数据库中,而不是laden
,从而破坏现有存储的数据。你知道吗
我真的希望是:
def Swallow:
def __init__(self):
self.laden = None
@property
def laden(self):
return self.laden
@laden.setter
def laden(self, laden):
updated = some_new_code(laden)
self.laden = updated
但在后一种情况下,setter调用自己——通常它不起作用。你知道吗
这是可以实现的吗?有什么想法吗?你知道吗
看来你真正的问题是:
不能只在实例上分配相同的名称,不
self.laden
是并且总是由property
对象处理。如果您对技术本质感兴趣,那么请阅读descriptor howto;property
对象是一个数据描述符,这意味着对instance.name
的所有访问都由type(instance).name
属性对象独占处理。没有例外。你知道吗您可以执行以下任一操作:
在
self.__dict__
中访问相同的名称:这将绕过正常的
object.attribute
路径,直接到达源。不使用属性;可以使用^{} hook 截取实例上的属性设置:
这将截获所有
instance.some_name
访问,但只有当some_name
是'laden'
时,您才能实际使用该值执行某些操作。在可以为您处理序列化的基类上定义一个自定义方法,并将配置添加到您的类中,以帮助该方法确定要序列化的属性,或者让该方法自动检测
property
对象。这样就可以包含从_name
到name
的翻译。使用MongoDB ORM library来处理对象序列化。我确信其中一些允许为字段定制setter,或者至少允许定义您自己的自定义字段类型,允许您在设置时更改值。
相关问题 更多 >
编程相关推荐