如何在 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 层次结构并构建发出请求所需的信息。