【发布时间】:2018-06-01 18:16:59
【问题描述】:
最后我修复了这个问题,使用这样的代码:(2018-06-03)
class Main:
@app.route('^/$')
def default(self):
return 'hello from class ccc'
module=sys.modules[func.__module__]
cls=getattr(module,func.__qualname__.replace('.'+func.__name__,''))
ins=cls()
m=getattr(cls,func.__name__)
resp.body=m(cls) #func.__module__+'.'+func.__qualname__+' func:'+func.__name__
这不是 pyhonic 对吧?我是 python 新手
//////旧
class D:
def __init__(self):
self.handlers={}
def check(self,func):
self.handlers['h']=func
def decorator(*args,**kwargs):
return func(*args,**kwargs)
return decorator
def call(self,p):
return self.handlers['h'](p)
d=D()
class Test:
@d.check
def prt(self,v):
print(v)
t=Test()
d.call(123)
有错误信息:prt() missing 1 required positional argument: 'v'
似乎需要一个名为“self”的参数,但我该如何传递呢?
//编辑(2018-06-01)
谢谢大家。我问这个是因为我尝试编写一个 python web 框架。我想要路由到如下类的方法
app=MyFrm()
class Controller:
@app.route('/')
def hello():
return 'hello world'
但现有的就像下面那样。在python中不需要或没有人这样做?
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
现在我使用@staticmethod 解决了这个问题
【问题讨论】:
-
decorator内部函数的意义何在?为什么不直接返回func? -
我不明白。装饰器和
call函数应该做什么? -
@Aran-Fey:想象一个事件处理系统,并且 OP 想要在一个类中注册这些方法作为事件回调。
-
@MartijnPieters 但这没有任何意义。没有可以传递给
prt方法的Test实例。如果这就是他们想要做的事情,那从根本上来说是有缺陷的。如果你是对的,OP 需要解释应该将哪个Test实例传递给prt以及为什么。 -
@Aran-Fey:这是此类系统中的常见缺陷,是的。你我都知道装饰器在类对象创建之前就被应用到函数上,以及绑定是如何工作的。对于 Python 新手来说,这一切都非常神奇,他们并不总是清楚为什么传递给装饰器的函数没有填写
self。
标签: python