Python 将数据序列化到pymongo;如何处理具有属性的setter?

Python 将数据序列化到pymongo;如何处理具有属性的setter?,python,python-3.x,properties,pymongo,Python,Python 3.x,Properties,Pymongo,我正在将\uuuu dict\uuuu序列化到mongo,但我想截取设置 满载t。如何在不将属性重命名为的情况下执行此操作 \u以便将属性与setter一起使用 我知道我可以用属性替换现有的加载的属性,并以这种方式使用setter: def Swallow: def __init__(self): self._laden = None @property def laden(self): return self._laden @

我正在将
\uuuu dict\uuuu
序列化到mongo,但我想截取设置
满载
t。如何在不将属性重命名为的情况下执行此操作
\u
以便将属性与setter一起使用

我知道我可以用
属性
替换现有的
加载的
属性,并以这种方式使用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
但这意味着序列化
\uuu dict\uuu
将在数据库中存储名称
\u loaded
,而不是
loaded
,从而破坏现有存储的数据

我真的希望它是:

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调用自己——通常不起作用


这是可以实现的吗?有什么想法吗?

看来你真正的问题是:

我正在将
\uuuu dict\uuuu
序列化到mongo,但我想截获设置
装载的
。如何在不将属性重命名为
\u loaded
的情况下将属性与setter一起使用

您不能只在实例上分配相同的名称,不。
self.loaded
是并且将始终由
属性
对象处理。如果您对技术细节感兴趣,请阅读;
属性
对象是一个数据描述符,这意味着对
实例.name
的所有访问都是由
类型(实例).name
属性对象专门处理的。没有例外

您可以执行以下任一操作:

  • self.\uu dict\uuu
    中访问相同的名称:

    @property
    def laden(self):
        return self.__dict__['laden']
    
    @laden.setter
    def laden(self, laden):
        updated = some_new_code(laden)
        self.__dict__['laden'] = updated
    
    这将绕过正常的
    对象.attribute
    路径,直接到达源

  • 不使用财产;您可以通过以下方式截取实例上的属性设置:

    这将截获所有
    实例。某些\u名称
    访问,但只有当
    某些\u名称
    'loaded'
    时,您才会实际使用该值执行操作

  • 在可以为您处理序列化的基类上定义一个自定义方法,并将配置添加到您的类中,以帮助该方法确定要序列化的属性,或者让该方法自动检测
    属性
    对象。这将允许您将
    \u名称
    包含到
    名称
    翻译中

  • 使用来处理对象序列化。我确信其中的一些允许为他们的字段定制setter,或者至少允许定义您自己的自定义字段类型,允许您在设置时更改值


我对您的问题进行了编辑,以便对未来的访问者有用;他们并不真正关心这个问题是如何演变的,只关心他们是否有同样的问题,以及答案是什么“编辑”标记对他们没有用,对于现在跟随的任何人来说,总是有“后历史”视图和底部的“编辑”标记。这是一个真正彻底的答案!谢谢你。
def __setattr__(self, name, value):
    if name == 'laden':
        value = some_new_code(laden)
    super().__setattr__(name, value)