Как спроектировать подпоток объекта в Python? - PullRequest
0 голосов
/ 20 апреля 2020

Я разрабатываю API в Python. API имеет две версии, разные версии имеют некоторые различия для каждого API.

class Client:
    def __init__(self, username, password, version):
        pass


class ClientV2:
    def __init__(self, username, password):
        pass

    def jobs():
        pass

    def model():
        # V3 doesn't have this method.
        pass

class ClientV3:
    def __init__(self, username, password):
        pass

    def jobs():
        # the logic is different from V2
        pass

То, что я ищу, выглядит так:

client = Client('user', 'passwd', 3)
# if the version = 3, then the client object will be ClientV3 actually.

# if the version = 2, then the client object will be ClientV2 actually.

Существует ли типичный объектно-ориентированный дизайн за это в Python?

Спасибо за любые предложения, спасибо.

Ответы [ 2 ]

2 голосов
/ 20 апреля 2020

В этом случае вы можете использовать Factory Pattern . Один такой рабочий пример:

ПРИМЕЧАНИЕ: если вы используете python2, убедитесь, что все перечисленные ниже классы унаследованы от object class

class Client:
    def __new__(cls, username, password, version):
        if version == 2:
            return ClientV2(username, password)
        elif version == 3:
            return ClientV3(username, password)

        raise Exception("version={0} not supported".format(version))

class ClientV2:
    def __init__(self, username, password):
        pass

    def jobs(self):
        pass


class ClientV3:
    def __init__(self, username, password):
        pass

    def jobs(self):
        # the logic is different from V2
        pass

, а затем вы можете использовать его в следующем путь:

client = Client('user', 'passwd', 3)
# if the version = 3, then the client object will be ClientV3 actually.

# if the version = 2, then the client object will be ClientV2 actually.
0 голосов
/ 20 апреля 2020

Не уверен, что правильно понял, но вы можете попробовать что-то:

Создать карту:

VERSION_MAP = {version_no: Class_Ref}

и внутри вашего класса клиента:

_client = VERSION_MAP[version_no](**kwargs)
access any method using _client.method
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...