每次更新任何 class 变量时如何 运行 在 class 内运行。 Python

How to run function inside class every time any class variable is updated. Python

我正在制作这个设置管理器,每次更新任何变量时,它都会使用 json 保存和加载数据。

就像我更改名为 value 的变量一样,class 应该独立 运行 名为 save() 和 load() 的函数

我的文件夹 Tree.

在Backend.Attributes文件中

class Attributes:

    def __init__(self, name: str , value = None, minimum: int|float|complex = 0, maximum : int|float|complex = 0, default : int|float|complex = 0 , use_default : bool = True , *args , **kwargs):

        '''
        Attributes for objects.
        name : compulsory: any name
        value: not cumpolsary : any
        minimum: not compulsory: minimum value. 
        maximum: not cumpulsory: maximum value
        default : default value
        use_default, if want to use default value as main value

        infinite number of arguments and keyword arguments
        '''

        self.name      = name
        self.value     = value if minimum == 0 and maximum == 0 else self.default if use_default else value
        self.minimum   = minimum
        self.maximum   = maximum
        self.undefined = args
        self.__d       = default
        for keys, values in kwargs.items():
            self.__dict__[keys] = values

    @property
    def default(self):
        return (self.maximum - self.minimum)/2 if self.__d == 0 else self.__d
    
    @property
    def range(self):
        return self.maximum - self.minimum

    def __contains__(self, __v):
        return True if __v <= self.maximum and __v >= self.minimum else False

    def __setitem__(self, __a, __v):
        self.__dict__[__a] = __v

    def __getitem__(self, __a):
        return self.__dict__[__a]
    
    def __delitem__(self, __i):
        del self.__dict__[__i]
    
    def __len__(self):
        return self.range

在 Settings.global 文件中

import Backend
import json

class Settings(Backend.Attributes):

    def __init__(self, name: str, value=None, minimum: int | float | complex = 0, maximum: int | float | complex = 0, default: int | float | complex = None, use_default: bool = True, *args, **kwargs):
        super().__init__(name, value, minimum, maximum, default, use_default, *args, **kwargs)
        self.BaseLocation = f"{Backend.Locations.Settings.path}/{self.name}"
        try:
            self.Load()
        except:
            self.Save()
        else:
            self.Load()
   
    def Save(self):
        print("saved")
        with open(f"{self.BaseLocation}.json", "w") as file: 
            json.dump(self.__dict__ , file , indent = 4)
        return True

    def Load(self):
        print("loaded")
        with open(f"{self.BaseLocation}.json", "r") as file:
            self.__dict__ = json.load(file)
        return True

我想做的就是每次更新属性 class 中的任何变量时 运行 save()load() 函数。 无需通过线程不断比较以前和新的变量(它是如此消耗 ram)。

您可以使用 setter 属性:

class Test:
    def __init__(self, x):
        self.x = x
    @property
    def x(self):
        return self._x
    @x.setter
    def x(self, value):
        self._x = value
        self.test() # call your function
    def test(self):
        print('x is set')

t = Test(1)
>>> 'x is set'
t.x = 2
>>> 'x i set'