淘宝联盟网站推广怎么做/云搜索神器
既然我了解了你的设计,你就把事情都搞错了。在
首先,Outer是一个类;它没有得到__call__ed,您的第17行只需要构造一个空的Outer对象,而不做任何操作。如果你想“调用”这个Outer对象,你可以定义一个__init__方法,或者像Sheena建议的那样,定义一个__new__并截获初始化,因为你实际上并不需要初始化的对象。在
老实说,我不认为不了解__call__是如何工作的人不应该尝试构建这样复杂的东西。但如果你坚持,继续读下去。在
在类中而不是在实例中收集这类信息是一个非常奇怪,而且可能很糟糕的设计。请记住,类变量实际上是全局变量,包括所有这些。如果您试图以可重入的方式使用Outer,或者从多个线程/事件处理程序/greenlets/中使用,那么最终的结果是它们的使用会相互影响。即使你认为现在这不可能是个问题,但在将来的某个时候也可能会。在
您可以创建一个Outer实例,并将其成员用作装饰器。例如:from outer_library import Outer
outer = Outer()
@outer.get("/")
…
但我不确定这是否更好。这里的整个设计似乎涉及到在模块级别执行操作,即使看起来您只是定义普通函数并在最后调用函数。事实上,你已经设法使自己混淆,这应该是一个设计有多混乱的证据。在
但是如果您想这样做,那么您可能需要在Outer.__init__方法中定义类,并将它们分配给实例成员。类是一级值,可以像其他值一样分配给变量。然后,使用这些类的__init__(或__new__)方法来完成您想要的工作,使这些类模拟函数。在
这似乎令人困惑或误导。但是请记住,您所要做的是以一种看起来像方法的方式使用一个类,因此这种混乱是问题的固有原因。但是如果您愿意,您可以将decorator编写为函数(在本例中,作为Outer)的普通实例方法;这只会使问题的另一部分变得更困难,而不是这一部分。在
设计这样的东西的一个更普通的方法是使Outer成为一个完全正常的类,人们可以对其进行子类化或创建实例,并提供一种显式的非花哨的方式将处理程序方法或函数附加到url。然后,一旦成功,设计一种简化处理程序注册到装饰器的方法。在