我對python相當陌生,我試圖編寫一個簡單的REST API調用實現。我的目標是能夠在運行時創建類的方法,並能夠使用方法名稱作爲API調用的基礎。例如list_virtual_networks會變成GET到http://localhost:8080/virtual-networks等。我也想練習一些更高級的面向對象技術。這裏是我的方法:在python運行時創建方法
def _api_call_wrapper(wrapped_function):
def wrapper_function(*args, **kwargs):
handler_name = wrapped_function.__name__
agent_logger.info('Got function name {}'.format(handler_name))
<do something>
return res
return wrapper_function
class API(HTTPConnection):
def __init__(self, host, port):
<do something>
def __getattr__(self, name):
@_api_call_wrapper
def handler(self, *args, **kwargs):
self.request('GET', self.last_url)
return self.getresponse()
handler.__name__ = name
setattr(self, name, handler)
agent_logger.info('Returning method with name {}'.format(self.name))
if __name__ == '__main__':
api = API(127.0.0.1, 8080)
api.list_virtual_networks()
這裏就是我在日誌中看到:
2016年12月8日23:05:03034 - AgentLogger - 信息 - 在0x1073c8d70>
返回法名稱功能wrapper_function 2016-12-08 23:05:03,034 - AgentLogger - INFO - 返回方法名稱無
我希望自己清楚地解釋我想實現的目標。有沒有辦法通過我試圖做到的方式至少粗略地解決它?
你正在嘗試一些相當新的python的難題 – turbulencetoo
你真的想做什麼?你確定在飛行中創建方法對於你想要做的事情是必要的嗎? –
對於目前我正在嘗試解決的問題,這不是100%必需的。當然,我可以手動定義所有的API調用方法,也可以只定義一個通用的方法,它可以在其輸入中獲取URL方法和HTTP方法的類型,併發送REST調用。我認爲這更加「科學」的興趣促使我以這種方式實施它。在我看來,它可能是一個非常靈活的實現,我以後也可以重用。 –