Как диза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... " и тд


Ответы (0 шт):