Как дизаcсемблировать то, что происходит при вызове метода в Python3?
Есть код на Python3: (файл inh_oop.py)
class BaseClass:
num_base_calls = 0
def call_me(self):
print("Calling method on Base Class")
self.num_base_calls += 1
class LeftSubclass(BaseClass):
num_left_calls = 0
def call_me(self):
super().call_me()
print("Calling method on Left Subclass")
self.num_left_calls += 1
class RightSubclass(BaseClass):
num_right_calls = 0
def call_me(self):
super().call_me()
print("Calling method on Right Subclass")
self.num_right_calls += 1
class SubClass(LeftSubclass, RightSubclass):
num_sub_calls = 0
def call_me(self):
super().call_me()
print("Calling method on Subclass")
self.num_sub_calls += 1
s = SubClass()
s.call_me()
Дело в том, что мне непонятно то, что происходит при вызове методе s.call_me().
А происходит это:
Calling method on Base Class
Calling method on Right Subclass
Calling method on Left Subclass
Calling method on Subclass
[Finished in 0.1s]
команда python3 -m dis inh_oop.py выдает в консоль:
o@o:~/Документы/PYTHON_SCRIPTS/oop/Philipp.pdf/inh$ python3 -m dis inh_oop.py
1 0 LOAD_BUILD_CLASS
2 LOAD_CONST 0 (<code object BaseClass at 0x7fbea12a38a0, file "inh_oop.py", line 1>)
4 LOAD_CONST 1 ('BaseClass')
6 MAKE_FUNCTION 0
8 LOAD_CONST 1 ('BaseClass')
10 CALL_FUNCTION 2
12 STORE_NAME 0 (BaseClass)
8 14 LOAD_BUILD_CLASS
16 LOAD_CONST 2 (<code object LeftSubclass at 0x7fbea12b2030, file "inh_oop.py", line 8>)
18 LOAD_CONST 3 ('LeftSubclass')
20 MAKE_FUNCTION 0
22 LOAD_CONST 3 ('LeftSubclass')
24 LOAD_NAME 0 (BaseClass)
26 CALL_FUNCTION 3
28 STORE_NAME 1 (LeftSubclass)
16 30 LOAD_BUILD_CLASS
32 LOAD_CONST 4 (<code object RightSubclass at 0x7fbea12b7540, file "inh_oop.py", line 16>)
34 LOAD_CONST 5 ('RightSubclass')
36 MAKE_FUNCTION 0
38 LOAD_CONST 5 ('RightSubclass')
40 LOAD_NAME 0 (BaseClass)
42 CALL_FUNCTION 3
44 STORE_NAME 2 (RightSubclass)
24 46 LOAD_BUILD_CLASS
48 LOAD_CONST 6 (<code object SubClass at 0x7fbea12b7780, file "inh_oop.py", line 24>)
50 LOAD_CONST 7 ('SubClass')
52 MAKE_FUNCTION 0
54 LOAD_CONST 7 ('SubClass')
56 LOAD_NAME 1 (LeftSubclass)
58 LOAD_NAME 2 (RightSubclass)
60 CALL_FUNCTION 4
62 STORE_NAME 3 (SubClass)
32 64 LOAD_NAME 3 (SubClass)
66 CALL_FUNCTION 0
68 STORE_NAME 4 (s)
33 70 LOAD_NAME 4 (s)
72 LOAD_ATTR 5 (call_me)
74 CALL_FUNCTION 0
76 POP_TOP
78 LOAD_CONST 8 (None)
80 RETURN_VALUE
т.е. происходит дизассемблирование самих классов в таком же порядке, как они написаны.
А мне нужно показать, что происходит при вызове метода. Примерно так: "вызывается метод экземпляра s.call_me(), в котором в строчке super().call_me() происходит вызов такого же метода в найденном слева направо суперклассе SubLeftClass класса SubClass... " и тд