【发布时间】:2013-07-01 20:17:07
【问题描述】:
我有基类:
class BaseGameHandler(BaseRequestHandler):
name = 'Base'
def get(self):
self.render(self.name + ".html")
现在,我需要定义它的一些子类,但问题是,它们必须有一个装饰器。等效代码为:
@route('asteroid')
class AsteroidGameHandler(BaseGameHandler):
name = 'asteroid'
@route('blah')
class BlahGameHandler(BaseGameHandler):
name = 'blah'
也许还有更多。
这里有一点背景:这是一个 tornado web 应用程序,@route 装饰器允许您将/blah 映射到BlahGameHandler。此代码将/blah 映射到BlahGameHandler 和/asteroid 到AsteroidGameHandler。
所以我想我应该在 python 中使用元编程并动态定义所有这些类。我尝试了以下不起作用的方法(并且不起作用我的意思是最终的网络应用程序在/asteroid 和/blah 上都抛出 404):
game_names = ['asteroid', 'blah']
games = list([game, type('%sGameHandler' % (game.title()), (BaseGameHandler,), {'name': game})] for game in game_names)
for i in xrange(len(games)):
games[i][1] = route(games[i][0])(games[i][1])
我错过了什么?这两个代码在运行时不是等效的吗?
【问题讨论】:
-
不起作用 不是问题描述。出了什么问题?你预计会发生什么?
-
您的代码看起来可以正常工作,除了没有在全局变量中设置对象。您遇到的具体问题是什么?
-
那么,
route()来自哪里?也许类装饰器有其他要求,比如类是全局模块? -
这是来自
tornroutes的@route装饰器还是别的什么?你真的会打电话给route.get_routes()列出某个时间点的路线吗?
标签: python python-2.7 metaprogramming tornado