Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
实现在属性更新时调用外部函数的Python类的正确方法_Python_Class_Object - Fatal编程技术网

实现在属性更新时调用外部函数的Python类的正确方法

实现在属性更新时调用外部函数的Python类的正确方法,python,class,object,Python,Class,Object,我目前正在尝试实现一个python类,该类自动与具有隐式缓冲的NoSQL数据库同步,这与 为了做到这一点,我需要跟踪用户发布的属性更新,并在每次属性更新时调用使该对象与数据库或缓冲区同步的函数 在Python中实现这一点的最佳方法是什么?如果它通过\uuuu setattr\uuuuuu和\uuuuu delattr\uuuuuuuuu,如何正确执行,以避免与垃圾收集器混淆?一种方法(我建议的方法)是使用 首先,为属性创建一个类,类似于: class Property: def __in

我目前正在尝试实现一个python类,该类自动与具有隐式缓冲的NoSQL数据库同步,这与

为了做到这一点,我需要跟踪用户发布的属性更新,并在每次属性更新时调用使该对象与数据库或缓冲区同步的函数

在Python中实现这一点的最佳方法是什么?如果它通过
\uuuu setattr\uuuuuu
\uuuuu delattr\uuuuuuuuu
,如何正确执行,以避免与垃圾收集器混淆?

一种方法(我建议的方法)是使用

首先,为属性创建一个类,类似于:

class Property:
    def __init__(self, *args, **kwargs):
        #initialize the property with any information it needs to do get and set
    def __get__(self,obj, type=None):
        #logic to get from database or cache

    def __set__(self,obj, value):
        #logic to set the value and sync with database if necessary.
然后在你的类实体类中,你有这样的东西:

class Student:
    student_id = Property(...)
    name = Property(...)
    classes = Property(...)

当然,在实践中,您可能有多种属性类型。我猜SQLAlchemy是这样做的,其中列类型是描述符。

您只需要跟踪现有属性的更新,还是还需要支持添加和删除?@Thayne:现在我只需要跟踪现有属性,不需要删除或添加,并且应该抛出错误。我将尝试此操作。然而,我看到了一个问题,我需要定义一个属性族,使用不同的名称引用不同的索引,有时使用相同的名称引用不同的属性。现在,除了元编程,我看不到任何其他方法。谢谢你的回答!