Является ли создание нескольких экземпляров класса динамически хорошей практикой? Альтернативы?

#python #class #oop #data-structures

#python #класс #ооп #структуры данных

Вопрос:

Предыстория

Я работаю с вызовами API, которые возвращают данные сетевого элемента (к вашему сведению, телекоммуникационная отрасль).

Я динамически создаю ‘x’ количество экземпляров класса на основе ‘meta’ ответа от api, который сообщает мне, сколько таких элементов, к которым я обращаюсь, существует в сети. Это не то, что я могу знать заранее (может быть 1 элемент, может быть 10, 100 и т.д.).

Теперь каждый элемент имеет несколько возможных атрибутов (name, lat / long, ip_address, MAC, type …. и т.д.), Поэтому я подумал, что структура класса будет лучшей. Я впервые использую классы.

Вопрос

Это лучшая практика? Каковы альтернативы этому подходу?

Код

 # Update the Node class's 'num_nodes' class level variable
Node.get_number_of_nodes()

# Create 'x' amount of Node instances and store in a list, based on 'num_nodes'
nodes = [Node() for x in range(Node.num_nodes)]

# Grab unique node ids and assign to the instances of Node
[node.get_node_ids() for node in nodes]
 
 class Node:
    """
    A class to represent a network node.
    """

    # Shared class variables
    num_nodes = 0

    # Shared class instances
    session = Session()

    @classmethod
    def get_number_of_nodes(cls):
        """
        Api call to ### which fetches number of nodes metadata
        """
        path = "####"
        url = f"{cls.session.HOST}{path}"
        headers = {'Authorization': #####,}
        params = {'limit': 10000,}

        resp = request(
            "GET", url, headers=headers, params=params, verify=False
        )
        resp = resp.text.encode('utf8')
        resp = json.loads(resp)

        cls.num_nodes = resp['meta']['total']

    def get_node_ids(self):
        """
        For an instance of Node, get its attributes from ###.
        """
        pass


 

Комментарии:

1. Я бы не стал изменять атрибут класса, потому что что, если вы захотите создать две коллекции узлов в будущем? Вместо метода класса для получения количества узлов и последующего их отдельного создания используйте метод класса, который является фабрикой, которая создает и возвращает список узлов.

2. Спасибо @barny, сейчас я разберусь с фабриками и отвечу здесь, как у меня дела

3. Я согласен с @barny. Помимо прочего, классы созданы именно для динамического создания экземпляров. Обычно вы создаете экземпляр с ClassName() помощью этого вызова ClassName.__init__() , но вы также можете добавить другие методы класса, которые действуют как фабрика, возвращая ClassName экземпляр (или даже коллекцию экземпляров). Для альтернатив, может быть, вы хотите иметь Network экземпляры, содержащие список Node s, и переместить Node управление из Node класса в Network класс (кроме того Node.id , что каждый узел все еще хранит).