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