【问题标题】:python defining multiple classes with decoratorspython用装饰器定义多个类
【发布时间】: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/asteroidAsteroidGameHandler

所以我想我应该在 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


【解决方案1】:

您使用的库仅在您的模块中查找全局类对象。

将每个类设置为全局; globals() 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) 只考虑顶级对象。

【讨论】:

    猜你喜欢
    • 2012-04-11
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 2021-07-16
    • 2011-04-28
    • 1970-01-01
    • 2013-02-06
    • 2022-08-15
    相关资源
    最近更新 更多