#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
, что каждый узел все еще хранит).