Преобразование объекта класса к list и dict
Захотелось мне поизучать графы, и вот написал я простой класс Graph, в нём есть переменная g_map, которая хранит сам граф в виде словаря примерно так:
class Graph:
g_map = dict()
...
Не очень важно сейчас
...
def __init__(self, g):
self.g_map = g
a = Graph({'a': {'a': 1, 'b': 1, 'c':12, 'd': 31, 'e': 19},
'b': {'a': 1, 'b': 32, 'c':2, 'd': 31, 'e': 19},
'c': {'a': 12, 'b': 2, 'c':0, 'd': 12, 'e': 19},
'd': {'a': 31, 'b': 31, 'c':12, 'd': 0, 'e': 31},
'e': {'a': 19, 'b': 19, 'c':19, 'd': 31, 'e': 0}
})
таким образом, я могу хранить вершины по названиям, и называть их как угодно
(здесь в словаре по каждому ключу (название вершины) хранится словарь где по каждому ключу(опять же название вершины) хранится значение длины дороги до той вершины )
я хочу, чтоб я мог обращатся к графу вот так:
print(a['a']['c'])
# вернет 12
для этого в классе Graph я реализовал методы:
def __getitem__(self, item):
else:
return self.g_map[item]
def __setitem__(self, key, value):
self.g_map[key] = value
def __len__(self):
return len(self.g)
этот код прекрасно работает, но я хочу иметь возможность такого: dict(a) который бы возвращал по сути g_map
и list(a) который бы работал так же как list(dict(какой-то словарь)) то есть возвращал список всех ключей. то есть чтобы list(a) в данном примере возвращал ['a', 'b', 'c', 'd', 'e']
я думал для этого есть методы типа __list__, __dict__, но как оказалось их нет, и я прошу вашей помощи:
Как реализовать нужное мне поведение?
Ответы (1 шт):
Для того чтобы cрабатывал метод dict и list на вашем объекте вам необходимо реализовать методы __iter__, __getitem__ и keys. И в простом варианте это можно сделать так:
class A():
def __init__(self, a):
self.a = a
def __iter__(self):
return self.a.__iter__()
def __getitem__(self, *args):
return self.a.__getitem__(*args)
def keys(self):
return self.a.keys()
obj = A({"x": 1, "y": 2, "z": 3})
print(dict(obj))
print(list(obj))
Можно попробовать сделать тоже самое при помощи наследования.