python-2.7 - 定义多个类的python

  显示原文与译文双语对照的内容
0 0

我有基类:


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 网络应用程序,@route decorator允许你把 /blah 映射到 BlahGameHandler 。 这里代码将 /blah 映射到 BlahGameHandler,并将 /asteroid 映射到 AsteroidGameHandler

所以我认为我应该在 python 中使用元编程,并快速定义所有这些类。 我尝试了以下不工作的( 我的意思是,最终的网络应用在 /asteroid/blah 上都 throws 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])

我丢失了什么这两个密码在运行时?

时间: 原作者:

0 0

你使用的库只查找模块中的全局类对象。

将每个类设置为全局类;globals() 函数使你可以将模块命名空间作为字典访问:


for i in xrange(len(games)):
 globals()[games[i][1].__name__] = route(games[i][0])(games[i][1])

include() 代码不寻找你的视图列表。

具体来说,include() 使用以下循环来检测处理程序:


for member in dir(module):
 member = getattr(module, member)
 if isinstance(member, type) and issubclass(member, web.RequestHandler) and hasattr(member, 'routes'):
 #.. .
 elif isinstance(member, type) and issubclass(member, web.RequestHandler) and hasattr(member, 'route_path'):
 #.. .
 elif isinstance(member, type) and issubclass(member, web.RequestHandler) and hasattr(member, 'rest_route_path'):
 #.. .

dir(module) 只考虑顶层对象。

原作者:
...