-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathlister.py
More file actions
55 lines (50 loc) · 2.5 KB
/
lister.py
File metadata and controls
55 lines (50 loc) · 2.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# coding=utf-8
class ListTree(object):
"""
Примесный класс, в котором метод __str__ просматривает все дерево классов
и составляет список атрибутов всех объектов, находящихся в дереве выше
self; вызывается функциями print(), str() и возвращает сконструированную
строку со списком; во избежание конфликтов с именами атрибутов клиентских
классов использует имена вида __X; для рекурсивного обхода суперклассов
использует выражение-генератор; чтобы сделать подстановку значений более
очевидной, использует метод str.format()
"""
def __str__(self):
self.__visited = {}
return "<Instance of {0}, address {1}:\n{2}{3}>".format(
self.__class__.__name__,
id(self),
self.__attrnames(self, 0),
self.__listclass(self.__class__, 4))
def __listclass(self, aClass, indent):
dots = "." * indent
if aClass in self.__visited:
return "\n{0}<Class {1}:, address {2}: (see above)>\n".format(
dots,
aClass.__name__,
id(aClass))
else:
self.__visited[aClass] = True
genabove = (self.__listclass(c, indent + 4)
for c in aClass.__bases__)
return "\n{0}<Class {1}, address {2}:\n{3}{4}{5}>\n".format(
dots,
aClass.__name__,
id(aClass),
self.__attrnames(aClass, indent),
"".join(genabove),
dots)
def __attrnames(self, obj, indent):
spaces = " " * (indent + 4)
result = ""
for attr in sorted(obj.__dict__):
if attr.startswith("__") and attr.endswith("__"):
result += spaces + "{0}=<>\n".format(attr)
else:
result += spaces + "{0}={1}\n".format(attr, getattr(obj, attr))
return result
if __name__ == '__main__':
class C(ListTree):
def __init__(self): pass
c = C()
print(c)