我試圖找到一種很好的方法來輕鬆註冊Python類中某些命令的處理程序。這些處理程序將被登記爲SomeBaseClass
的子類,並且僅在那裏可用。不幸的是,我開始認爲自己正在做的工作超出必要。現在,我已經有了:註冊每個類處理程序
def register_handlers(cls):
cls._handlers = {}
for method in cls.__dict__.values():
if hasattr(method, "handler_name"):
cls._handlers[method.handler_name] = method
return cls
class SomeBaseClass(object):
_handlers = None
def __init__(self):
for h in self._handlers:
self._handlers[h] = types.MethodType(self._handlers[h], self, SomeBaseClass)
def run_action(self, name, *args):
return self._handlers[name](*args)
def actual_handler_wrapper(f):
....
f.handler_name = name
....
有幾個問題在這裏:
- 兩個類和它的處理程序必須加以裝飾
- 子類的第二個層次是不容易得到(
_handlers
將不得不分配和檢查繼承的各個層面) - 結合處理的一類時初始化看來髒兮兮
有什麼方法可以改善嗎?我可能通過將SomeBaseClass
更改爲元類來擺脫register_handlers
。它還可以在創建課程時綁定處理程序。但這似乎比目前的方法更加複雜。
有沒有更簡單的方法?
編輯:使用範例:
@register_handlers
class SubClass(SomeBaseClass):
@actual_handler_wrapper
def handler(self):
...
你抽象這種模式是什麼樣的?是否稍後編寫'handler = SomeBaseClass._registry [some_name]'的目標是?或者有些不同? –
'@ register_handlers'應該在'SomeBaseClass(object)'類之上嗎?什麼是'cn'? – senderle
'cn'是一個複製和粘貼錯誤。我試圖在'SomeBaseClass'中爲通用調度函數註冊函數,這會將外部請求傳遞給一些'self._handlers [action_name]'。 – viraptor