下面非常简化的代码中的观察者模式运行良好.我想有一个装饰器@on_event在Observable单例中进行注册.
在下面的O2类中,这不起作用.问题当然是在创建实例之前调用了on_event装饰器,并且注册将是未绑定方法event.在某种程度上,我必须延迟注册,直到初始化O2对象.也许不用说,但我想在O2中添加的是装饰器,如下面的代码所示.
但肯定必须有解决方案吗?我用Google搜索但找不到任何东西,并尝试了几种方法.
class Observable(object):
_instance = None
@classmethod
def instance(cls):
if not cls._instance:
cls._instance = Observable()
return cls._instance
def __init__(self):
self.obs = []
def event(self, data):
for fn in self.obs:
fn(data)
def on_event(f):
def wrapper(*args):
return f(*args)
Observable.instance().obs.append(f)
return wrapper
class O(object):
def __init__(self, name):
self.name = name
Observable.instance().obs.append(self.event)
def event(self, data):
print self.name + " Event: " + data
class O2(object):
def __init__(self, name):
self.name = name
@on_event
def eventx(self, data):
print self.name + …Run Code Online (Sandbox Code Playgroud) 我的观点中有类似下面的设置:
@app.route("/test")
def test():
...
@app.route("/<to>")
def page(to):
...
Run Code Online (Sandbox Code Playgroud)
在访问"/ test"url时,似乎总是会调用示例中的函数测试.这也是我想要的.但我在文档中找不到这种行为.这样定义的名称总是优先于变量吗?或者是重要的定义的顺序?我能否以任何方式确定优先级,以确保将来不会破坏?