我有一個班的工作是包裝另一個類(我不控制的代碼),攔截所有對包裝類的調用,執行一些邏輯,並將調用傳遞給底層類。這裏有一個例子:定義或記錄由__getattr__處理的呼叫的正確方法是什麼?
class GithubRepository(object):
def get_commit(self, sha):
return 'Commit {}'.format(sha)
def get_contributors(self):
return ['bobbytables']
class LoggingGithubRepositoryWrapper(object):
def __init__(self, github_repository):
self._github_repository = github_repository
def __getattr__(self, name):
base_func = getattr(self._github_repository, name)
def log_wrap(*args, **kwargs):
print "Calling {}".format(name)
return base_func(*args, **kwargs)
return log_wrap
if __name__ == '__main__':
git_client = LoggingGithubRepositoryWrapper(GithubRepository())
print git_client.get_commit('abcdef1245')
print git_client.get_contributors()
正如你所看到的,我這樣做是在包裹類實現__getattr__
,並委託給底層階級的方式。這種方法的缺點是LoggingGithubRepositoryWrapper
的用戶不知道底層GithubRepository
實際上具有哪些屬性/方法。
這使我對我的問題:有沒有一種方法來定義或記錄由__getattr__
處理的呼叫?理想情況下,我希望能夠自動完成git_client.
並提供支持的方法列表。感謝您的幫助!
不,沒有 - Python是高度動態的,所以一旦你把'__getattr__'放在混合中,或多或少不可能告訴什麼可以工作。 – jonrsharpe