Как лучше создать экземпляр другого подкласса на основе файла конфигурации? - PullRequest
1 голос
/ 13 мая 2019

У меня есть базовый класс и несколько подклассов, унаследованных от него.Мне нужно создать правильный подкласс на основе предоставленного файла конфигурации.Теперь, один из способов сделать это - использовать оператор if, else и проверить файл конфигурации для создания экземпляра подкласса, но это кажется плохим программным кодом.Кроме того, позже, если я добавлю больше подклассов, цепочка if-else будет расти очень долго.Может кто-нибудь предложить лучший способ сделать это?

У меня есть шаблон кода, где вместо файла конфигурации я беру аргумент командной строки, чтобы сделать то же самое.

class Shape(object):
    pass

class Rectangle(Shape):
    pass

class Circle(Shape):
    pass

class Polygon(Shape):
    pass

import argparse
if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('-s', '--shape', help='Provide the shape')

    args = parser.parse_args()

    if args.shape == 'circle':
        shape = Circle()
        print(shape.__class__.__name__)
    elif args.shape == 'rectangle':
        shape = Rectangle()
        print(shape.__class__.__name__)
    elif args.shape == 'polygon':
        shape = Polygon()
        print(shape.__class__.__name__)
    else:
        raise Exception("Shape not defined")

1 Ответ

3 голосов
/ 13 мая 2019

Вы можете поместить весь свой класс в объект словаря, подобный этому

my_shapes = { "rectangle" : Rectangle, "circle": Circle, "polygon": Polygon }
args = parser.parse_args()
if args.shape in my_shapes:
    shape = my_shapes[args.shape]() #Here you will do the same thing that the if else 
else:
    raise Exception("Shape not defined")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...