如何在 Python class 中对方法进行分组?
How to group methods in Python class?
刚开始使用 python 学习 OOP,如果这个问题过于简单,我深表歉意,欢迎对我的代码进行任何改进。我正在尝试使用 requests
库和 SurveyMonkey 的 API 为 API 编写包装器。这是我目前所拥有的:
class SurveyMonkey:
def __init__(self, access_token, base_url = "https://api.surveymonkey.com"):
self.access_token = access_token
self.base_url = base_url
self.headers = {
"Authorization": f"Bearer {self.access_token}",
"Content-Type": "application/json"
}
self.survey_id = str()
self.params = dict()
def get_json(self):
return requests.get(self.url, headers=self.headers, params=self.params).json()
def list_surveys(self):
self.url = f"{self.base_url}/v3/surveys"
return self.get_json()
def get_survey(self, survey_id):
self.survey_id = survey_id
self.url = f"{self.base_url}/v3/surveys/{self.survey_id}"
return self.get_json()
def get_survey_details(self, survey_id):
self.survey_id = survey_id
self.url = f"{self.base_url}/v3/surveys/{self.survey_id}/details"
return self.get_json()
def get_survey_responses_page(self, survey_id, params=dict()):
self.survey_id = survey_id
self.params = params
self.url = f"{self.base_url}/v3/surveys/{self.survey_id}/responses"
return self.get_json()
def get_survey_responses_bulk_page(self, survey_id, params=dict()):
self.survey_id = survey_id
self.params = params
self.url = f"{self.base_url}/v3/surveys/{self.survey_id}/responses/bulk"
return self.get_json()
sm = SurveyMonkey(access_token)
我使用过库,我注意到其中的方法以某种方式进行了分组。 SurveyMonkey 中有几个 survey
API,想知道我是否可以以某种方式将最后 4 种方法分组,以便我可以使用类似
的方法调用它们
sm.survey.get.details(id)
sm.survey.get.response.page(id)
sm.survey.get.response.bulk(id)
我真的不知道该怎么做
更新(感谢汤姆):
我已经按照 Tom 的规范重构了代码,它看起来像这样:
class SurveyMonkey:
def __init__(self, access_token, base_url = "https://api.surveymonkey.com"):
self.surveys = surveys(self)
self.survey_responses = survey_responses(self)
self.access_token = access_token
self.base_url = base_url
self.headers = {
"Authorization": f"Bearer {self.access_token}",
"Content-Type": "application/json"
}
self.survey_id = str()
self.params = dict()
def get_json(self):
return requests.get(self.url, headers=self.headers, params=self.params).json()
class surveys:
def __init__(self, parent: SurveyMonkey):
self.parent = parent
def list_surveys(self):
self.parent.url = f"{self.parent.base_url}/v3/surveys"
return self.parent.get_json()
def get_survey(self, survey_id):
self.survey_id = survey_id
self.parent.url = f"{self.parent.base_url}/v3/surveys/{self.survey_id}"
return self.parent.get_json()
def get_survey_details(self, survey_id):
self.survey_id = survey_id
self.parent.url = f"{self.parent.base_url}/v3/surveys/{self.survey_id}/details"
return self.parent.get_json()
class survey_responses:
def __init__(self, parent:SurveyMonkey):
self.parent = parent
def list_responses(self, survey_id, params=dict()):
self.survey_id = survey_id
self.parent.params = params
self.parent.url = f"{self.parent.base_url}/v3/surveys/{self.survey_id}/responses"
return self.parent.get_json()
def get_response(self, survey_id, response_id, params=dict()):
self.survey_id = survey_id
self.response_id = response_id
self.parent.params = params
self.parent.url = f"{self.parent.base_url}/v3/surveys/{self.survey_id}/responses/{response_id}"
return self.parent.get_json()
def get_response_details(self, survey_id, response_id, params=dict()):
self.survey_id = survey_id
self.response_id = response_id
self.parent.params = params
self.parent.url = f"{self.parent.base_url}/v3/surveys/{self.survey_id}/responses/{response_id}/details"
return self.parent.get_json()
def get_response_bulk(self, survey_id, params=dict()):
self.survey_id = survey_id
self.parent.params = params
self.parent.url = f"{self.parent.base_url}/v3/surveys/{self.survey_id}/responses/bulk"
return self.parent.get_json()
你可以这样做:
class SurveyMonkey:
def __init__(self):
self.survey = Survey(self)
class Survey:
def __init__(self, parent: SurveyMonkey):
self.parent = parent
self.get = Get(self)
class Get:
def __init__(self, parent: Survey):
self.parent = parent
self.response = Response(self)
def details(self, id):
print(id)
class Response:
def __init__(self, parent: Get):
self.parent = parent
def page(self, id):
print(id)
def bulk(self, id):
print(id)
sm = SurveyMonkey()
sm.survey.get.response.page(1)
然后您必须巧妙地构建请求函数调用、遍历 class 层次结构并构建发出请求所需的信息。
刚开始使用 python 学习 OOP,如果这个问题过于简单,我深表歉意,欢迎对我的代码进行任何改进。我正在尝试使用 requests
库和 SurveyMonkey 的 API 为 API 编写包装器。这是我目前所拥有的:
class SurveyMonkey:
def __init__(self, access_token, base_url = "https://api.surveymonkey.com"):
self.access_token = access_token
self.base_url = base_url
self.headers = {
"Authorization": f"Bearer {self.access_token}",
"Content-Type": "application/json"
}
self.survey_id = str()
self.params = dict()
def get_json(self):
return requests.get(self.url, headers=self.headers, params=self.params).json()
def list_surveys(self):
self.url = f"{self.base_url}/v3/surveys"
return self.get_json()
def get_survey(self, survey_id):
self.survey_id = survey_id
self.url = f"{self.base_url}/v3/surveys/{self.survey_id}"
return self.get_json()
def get_survey_details(self, survey_id):
self.survey_id = survey_id
self.url = f"{self.base_url}/v3/surveys/{self.survey_id}/details"
return self.get_json()
def get_survey_responses_page(self, survey_id, params=dict()):
self.survey_id = survey_id
self.params = params
self.url = f"{self.base_url}/v3/surveys/{self.survey_id}/responses"
return self.get_json()
def get_survey_responses_bulk_page(self, survey_id, params=dict()):
self.survey_id = survey_id
self.params = params
self.url = f"{self.base_url}/v3/surveys/{self.survey_id}/responses/bulk"
return self.get_json()
sm = SurveyMonkey(access_token)
我使用过库,我注意到其中的方法以某种方式进行了分组。 SurveyMonkey 中有几个 survey
API,想知道我是否可以以某种方式将最后 4 种方法分组,以便我可以使用类似
sm.survey.get.details(id)
sm.survey.get.response.page(id)
sm.survey.get.response.bulk(id)
我真的不知道该怎么做
更新(感谢汤姆):
我已经按照 Tom 的规范重构了代码,它看起来像这样:
class SurveyMonkey:
def __init__(self, access_token, base_url = "https://api.surveymonkey.com"):
self.surveys = surveys(self)
self.survey_responses = survey_responses(self)
self.access_token = access_token
self.base_url = base_url
self.headers = {
"Authorization": f"Bearer {self.access_token}",
"Content-Type": "application/json"
}
self.survey_id = str()
self.params = dict()
def get_json(self):
return requests.get(self.url, headers=self.headers, params=self.params).json()
class surveys:
def __init__(self, parent: SurveyMonkey):
self.parent = parent
def list_surveys(self):
self.parent.url = f"{self.parent.base_url}/v3/surveys"
return self.parent.get_json()
def get_survey(self, survey_id):
self.survey_id = survey_id
self.parent.url = f"{self.parent.base_url}/v3/surveys/{self.survey_id}"
return self.parent.get_json()
def get_survey_details(self, survey_id):
self.survey_id = survey_id
self.parent.url = f"{self.parent.base_url}/v3/surveys/{self.survey_id}/details"
return self.parent.get_json()
class survey_responses:
def __init__(self, parent:SurveyMonkey):
self.parent = parent
def list_responses(self, survey_id, params=dict()):
self.survey_id = survey_id
self.parent.params = params
self.parent.url = f"{self.parent.base_url}/v3/surveys/{self.survey_id}/responses"
return self.parent.get_json()
def get_response(self, survey_id, response_id, params=dict()):
self.survey_id = survey_id
self.response_id = response_id
self.parent.params = params
self.parent.url = f"{self.parent.base_url}/v3/surveys/{self.survey_id}/responses/{response_id}"
return self.parent.get_json()
def get_response_details(self, survey_id, response_id, params=dict()):
self.survey_id = survey_id
self.response_id = response_id
self.parent.params = params
self.parent.url = f"{self.parent.base_url}/v3/surveys/{self.survey_id}/responses/{response_id}/details"
return self.parent.get_json()
def get_response_bulk(self, survey_id, params=dict()):
self.survey_id = survey_id
self.parent.params = params
self.parent.url = f"{self.parent.base_url}/v3/surveys/{self.survey_id}/responses/bulk"
return self.parent.get_json()
你可以这样做:
class SurveyMonkey:
def __init__(self):
self.survey = Survey(self)
class Survey:
def __init__(self, parent: SurveyMonkey):
self.parent = parent
self.get = Get(self)
class Get:
def __init__(self, parent: Survey):
self.parent = parent
self.response = Response(self)
def details(self, id):
print(id)
class Response:
def __init__(self, parent: Get):
self.parent = parent
def page(self, id):
print(id)
def bulk(self, id):
print(id)
sm = SurveyMonkey()
sm.survey.get.response.page(1)
然后您必须巧妙地构建请求函数调用、遍历 class 层次结构并构建发出请求所需的信息。