用decorator定义多个类的python

2024-04-25 17:15:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我有基类:

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中使用元编程并动态定义所有这些类。我尝试了以下不起作用的方法(我所说的不起作用是指最终的web应用在/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])

我错过了什么?运行时这两个代码不是等价的吗?你知道吗


Tags: 代码nameselfwebgame定义装饰route
1条回答
网友
1楼 · 发布于 2024-04-25 17:15:41

您使用的库只在模块中查找全局类对象。你知道吗

将每个类设置为全局类;^{} function使您可以作为字典访问模块命名空间:

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)只考虑顶级对象。你知道吗

相关问题 更多 >