2013-07-01 91 views
1

多個類我有基類:蟒蛇定義與裝飾

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' 

也許還有一些。 這裏有一點背景:這是一個龍捲風網絡應用程序,@route修飾器允許您將/blah映射到BlahGameHandler。此代碼映射/blahBlahGameHandler/asteroidAsteroidGameHandler

所以我想我應該在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]) 

我缺少什麼?這兩個代碼在運行時是否相同?

+0

*不起作用*不是問題描述。出了什麼問題?你期望會發生什麼? –

+0

你的代碼看起來像它會工作*很好*,除了不在你的全局變量中設置對象。你遇到的問題到底是什麼? –

+0

那麼'route()'從哪裏來?也許類裝飾器有額外的要求,如類是一個模塊的全球? –

回答

0

您使用的庫僅在您的模塊中查找全局類對象。

將每個類設置爲全局;在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)僅考慮頂層對象。