Я разрабатываю 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?

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

0
mikolaj 20 Апр 2020 в 09:30

2 ответа

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

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

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.
1
akazuko 20 Апр 2020 в 06:34

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

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

VERSION_MAP = {version_no: Class_Ref}

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

_client = VERSION_MAP[version_no](**kwargs)
access any method using _client.method
0
Arpit 20 Апр 2020 в 06:37