[better-py-ru] Как построить граф объектов или получить список суперклассов для self.__class__ ?

18 views
Skip to first unread message

Dmitry Ponyatov

unread,
Apr 21, 2010, 1:45:29 AM4/21/10
to Пишем на Python лучше
Здравствуйте

Помогите пожалуйста вот с такой проблемой:

Мне нужно построить граф (структура данных) с доп.параметрами для
узлов и ребер:

include nxgraph # модуль структуры данных "граф"
# позволяющий использовать любые объекты для идентификации узлов и
ребер
# (nxgraph также игнорирует добавление 2+ узлов/ребер поэтому не
требуются лишние проверки)

OBJ_TREE = nxgraph.DiGraph() # направленный граф

OBJ_TREE.add_node(object,color='red') # корневой объект дерева

class A(object):
def __init__(self):
object.__init__(self) # (1)
# возможно map(lambda s:s.__init__(self), self.__super__)
лучше если был бы __super__
OBJ_TREE.add_node(self.__class__,color='red') # (2) добавить
узел класса self
for SUP in self.__super__:
OBJ_TREE.add_edge(SUP,self.__class__,color='red') # (3)
добавить ребра от суперклассов
OBJ_TREE.add_node(self,color='blue') # (4) добавить узел self
OBJ_TREE.add_edge(self.__class__,self,color='blue') # (5)
добавить ребро порождения объекта
OBJ_TREE.plot(sys.argv[0]+'.objtree.png') # дамп графа в .png

class B(A):
pass

class C(A):
pass

Использую Python 2.5 и не удается реализовать строку (3) в классе A ,
но остальное работает
Как можно реализовать функцию get_super(self) возвращающую список
суперклассовдля self.__class__ ? Желательно для py2.5

Сейчас приходиться использовать индийский код прописывая __init__ для
каждого подкласса,
что очень достает и порождает лишние ошибки

class B(A):
def __init__(self):
A.__init__(self)
OBJ_TREE.add_node(A,B) ; OBJ_TREE.plot('OBJ_TREE.png')

class C(A):
def __init__(self):
A.__init__(self)
OBJ_TREE.add_node(A,C) ; OBJ_TREE.plot('OBJ_TREE.png')

class D(B,C):
def __init__(self):
B.__init__(self) ; OBJ_TREE.add_node(B,D)
C.__init__(self) ; OBJ_TREE.add_node(C,D)
OBJ_TREE.plot('OBJ_TREE.png')

--
Группа: http://groups.google.com/group/better-python-ru
Отписка: better-python-...@googlegroups.com

Sergey Schetinin

unread,
Apr 21, 2010, 9:21:05 AM4/21/10
to better-p...@googlegroups.com
Посмотрите в документации C.__bases__, C.__mro__, inspect.getmro(C). Ну и метаклассы можно сразу посмотреть.

2010/4/21 Dmitry Ponyatov <fo...@km.ru>



--
Best Regards,
Sergey Schetinin

http://s3bk.com/ -- S3 Backup
http://word-to-html.com/ -- Word to HTML Converter
Reply all
Reply to author
Forward
0 new messages