Форум сайта python.su
0
Исследую один проект, состоящий из большого количества модулей, и в процессе работы этого проекта создается большое количество объектов.
Для исследовательских целей я хотел бы получить человекочитаемое дерево объектов.
К сожалению, в ООП я не силен, в Питоне тем более, поэтому заранее прошу ногами не пинать, если где сморожу глупость.
В общем, имеем один “корневой” объект, скажем, “А”, у которого много-много свойств и методов.
Хотелось бы написать процедуру функцию, которая бы вывела структуру этого объекта в тесктовый файл.
Например, допустим, у этого “А” есть методы method1, method2, method3, и свойства prop1, prop2, prop3, prop4.
Задача: получить вывод вроде
A object of type Aobject
A.method1 function
A.method2 function
A.method3 function
A.prop1 integer
A.prop2 string
A.prop3 object of type Bobject
A.B.method1 function
A.B.method2 function
A.B.prop1 string
...
end of tree
Офлайн
14
переопределить __repr__, использовать pprint
Офлайн
0
Спасибо. Посмотрю на pprint повнимательней. А как переопределять __repr__ для чужого уже созданногого объекта (дерева объектов)?
Офлайн
14
Для чужого не выйдет. Но в любом случае в pprint есть исходники обходчика, похожего на то что вам нужно.
Офлайн
0
с repr не разобрался, и с pprint тоже не срослось.
результат pprint-а ничем не отличается от простого принта, увы, про объект пишет “XXXobject is <modulename.XXXobject object at 0x0FD03290>”
И тут есть еще один момент, с которым я пока не знаю, как справиться. Допустим, я напишу обходчик свойст-методов, предусмотрю в нем рекурсию, чтобы по нескольку раз одно и то же не описывать, зацикливаясь. Пойду обходить дерево от корня, благо, корневой объект я знаю.
Но… Toplevelobject определяется в модуле Toplevelobject, и в проекте везде подключается через import Toplevelobject поэтому, когда я пишу, скажем
print str(Toplevelobject)
module 'Toplevelobject' (built-in)
Офлайн
14
Я предлагал посмотреть исходники у Lib/pprint.py
про top level object ничего не понял
Офлайн
0
Toplevelobject - это мое наименование, выдуманное. “корневой” объект, от которого растут все остальные объекты.
Как, скажем, у HTML страницы в DOM-модели все растет от Document.
исходники pprint счас начну раскуривать. спасибо.
Офлайн
253
С рекурсивным разбором там есть некоторые особенности которые можно отметить:
в зависимости от задачи надо разбирать:
1 содержимое dict
2 _fields_ для ctypes
3 property для свойств
или делать dir и смотреть что есть что…
Офлайн
0
чем
print dir(object)
for x in object.__dict__.itervalues():
print x
Офлайн
253
нет dict и dir разные вещи.
сравните dir и dict для этого класса
class Ta(object):
def a():
pass
s=3
@property
def f(self):
return 0
def __init__(self):
self.b=3
Офлайн