Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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_Callback_Magic Methods - Fatal编程技术网

Python模型回调

Python模型回调,python,callback,magic-methods,Python,Callback,Magic Methods,我试图实现一个简单的模型类,该类在类中设置属性时执行回调,但是在我的应用程序中尝试使用它时,我得到了AttributeError。这个实例似乎没有我在初始值设定项中设置的属性,对此我有点困惑。我没有太多地使用魔法方法,因此一些详细说明可能会有所帮助: class ReportModel(object): def __init__(self): self.current_date = None self.prior_date = None

我试图实现一个简单的模型类,该类在类中设置属性时执行回调,但是在我的应用程序中尝试使用它时,我得到了AttributeError。这个实例似乎没有我在初始值设定项中设置的属性,对此我有点困惑。我没有太多地使用魔法方法,因此一些详细说明可能会有所帮助:

class ReportModel(object):

    def __init__(self):
        self.current_date = None
        self.prior_date = None
        self._callbacks = defaultdict([])

    def __setattr__(self, attr, value):
        object.__setattr__(self, attr, value)
        for func in self._callbacks[attr]:
            func(value)

    def set_callback(self, attr, function):
        self._callbacks[attr].append(function)
回溯:

AttributeError: 'ReportModel' object has no attribute '_callbacks'

当运行
\uuuu init\uuuuu
并设置
self.current\u date
self.previor\u date
时,将在类实例化期间调用您的
\uuuuuuuuu setattr\uuuuuuu
方法

要解决此问题,您必须使用try,但块环绕回调调用除外,以防止出现错误

    try:
        for func in self._callbacks[attr]:
            func(value)
    except:
        pass

当运行
\uuuu init\uuuuu
并设置
self.current\u date
self.previor\u date
时,将在类实例化期间调用您的
\uuuuuuuuu setattr\uuuuuuu
方法

要解决此问题,您必须使用try,但块环绕回调调用除外,以防止出现错误

    try:
        for func in self._callbacks[attr]:
            func(value)
    except:
        pass

由于您已经重写了
\uuuu setattr\uuuuu()
,当您在
\uuuu init\uuuuuu()
中执行
self.current\u date=None
时,它将调用您的
\uuuuuu setattr()
实现,该实现将尝试访问
self.\u回调
。这就是导致AttributeError的原因

以下是解决此问题的一个选项:

class ReportModel(object):

     def __init__(self):
         object.__setattr__(self, '_callbacks', defaultdict(list))
         self.current_date = None
         self.prior_date = None

     def __setattr__(self, attr, value):
         object.__setattr__(self, attr, value)
         for func in self._callbacks[attr]:
             func(value)

     def set_callback(self, attr, function):
         self._callbacks[attr].append(function)
这将使用
对象添加
\u回调
属性。
在添加任何其他属性之前添加setattr(),以便以后对
\uu setattr()
实例的
调用不会在访问
self.\u回调
时阻塞

或者,您可以修改
\uuuu setattr\uuuu()
,以检查
\u回调是否存在
属性:

class ReportModel(object):

     def __init__(self):
         object.__setattr__(self, '_callbacks', defaultdict(list))
         self.current_date = None
         self.prior_date = None

     def __setattr__(self, attr, value):
         object.__setattr__(self, attr, value)
         if hasattr(self, '_callbacks'):
             for func in self._callbacks[attr]:
                 func(value)

     def set_callback(self, attr, function):
         self._callbacks[attr].append(function)

由于您已经重写了
\uuuu setattr\uuuuu()
,当您在
\uuuu init\uuuuuu()
中执行
self.current\u date=None
时,它将调用您的
\uuuuuu setattr()
实现,该实现将尝试访问
self.\u回调
。这就是导致AttributeError的原因

以下是解决此问题的一个选项:

class ReportModel(object):

     def __init__(self):
         object.__setattr__(self, '_callbacks', defaultdict(list))
         self.current_date = None
         self.prior_date = None

     def __setattr__(self, attr, value):
         object.__setattr__(self, attr, value)
         for func in self._callbacks[attr]:
             func(value)

     def set_callback(self, attr, function):
         self._callbacks[attr].append(function)
这将使用
对象添加
\u回调
属性。
在添加任何其他属性之前添加setattr()
,以便以后对
\uu setattr()
实例的
调用不会在访问
self.\u回调
时阻塞

或者,您可以修改
\uuuu setattr\uuuu()
,以检查
\u回调是否存在
属性:

class ReportModel(object):

     def __init__(self):
         object.__setattr__(self, '_callbacks', defaultdict(list))
         self.current_date = None
         self.prior_date = None

     def __setattr__(self, attr, value):
         object.__setattr__(self, attr, value)
         if hasattr(self, '_callbacks'):
             for func in self._callbacks[attr]:
                 func(value)

     def set_callback(self, attr, function):
         self._callbacks[attr].append(function)

尝试了你的实现,我得到了一个类型错误:文件“C:\FAST\Workspace\FIMOApp\src\FIMOApp\models.py”,第12行,在init对象中“C:\FAST\Workspace\FIMOApp\src\FIMOApp\models.py”,第12行,在init对象中。\uuuu setattr\uuuu(self,'u callbacks',defaultdict([])类型错误:第一个参数必须是callableWoops-它是defaultdict,抱歉