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

2024-04-27 02:21:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在将__dict__序列化到mongo,但我想拦截设置 ladent.如何在不将属性重命名为的情况下执行该操作 _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调用自己——通常它不起作用。你知道吗

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


Tags: selfnonereturn属性序列化initdef情况
1条回答
网友
1楼 · 发布于 2024-04-27 02:21:45

看来你真正的问题是:

I'm serialising __dict__ to mongo, but I want to intercept setting laden. How can I do that without having to rename the attribute to _laden in order to use a property with a setter?

不能只在实例上分配相同的名称,不self.laden是并且总是由property对象处理。如果您对技术本质感兴趣,那么请阅读descriptor howtoproperty对象是一个数据描述符,这意味着对instance.name的所有访问都由type(instance).name属性对象独占处理。没有例外。你知道吗

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

  • self.__dict__中访问相同的名称:

    @property
    def laden(self):
        return self.__dict__['laden']
    
    @laden.setter
    def laden(self, laden):
        updated = some_new_code(laden)
        self.__dict__['laden'] = updated
    

    这将绕过正常的object.attribute路径,直接到达源。

  • 不使用属性;可以使用^{} hook截取实例上的属性设置:

    def __setattr__(self, name, value):
        if name == 'laden':
            value = some_new_code(laden)
        super().__setattr__(name, value)
    

    这将截获所有instance.some_name访问,但只有当some_name'laden'时,您才能实际使用该值执行某些操作。

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

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

相关问题 更多 >