86795


Python 3.9.10を使っています。

[code]

    class cls_Common(object):
    
        def __init__(略)
            以下略
    
        def Process_A():・・・①
            以下略
    
        def Process_B():
            前略
            
            self.Process_A():
            
            以下略
    
[/code]

* * *
[code]

    class cls_main(cls_Common):
        
        def __init__(略)
            super().__init__(略)
            以下略
    
        def Process_Z():
            super().Process_B():
            以下略
    
        def Process_A():・・・②
            以下略
    
[/code]

* * *

というクラス定義をした上で、

[code]

    if __name__ == '__main__':
        print_hi('PyCharm')
        
        CLS = cls_main(略)
        CLS.Process_Z()　・・・③
    
[/code]

とした場合、Process_Aは、最終的に②が呼ばれるのではないかと思います。  
③のような場所から呼び出す前提で、Process_B内（またはcls_Common内）に何らかの処理（条件分岐など）を埋め込むことで、Process_Aの①、②を呼び分けることは可能ですか？

よろしくお願いいたします。


CC BY-SA 4.0
2022-03-11T01:48:38.503
86793
2022-03-11T04:12:15.890
43160
question
python3
オーバーライドされた関数を基底クラスからの呼び分ける方法


やりたい事と合っているか分かりませんが、以下のように単純に`cls_Common`側に変数/パラメータ/メソッドを定義して、それを元に呼び出し先を変更出来ると思われます。  
変数はクラス/グローバル変数などでも出来るでしょうから、お好みで。

[code]

    class cls_Common(object):
        def __init__(self):
            self.rootmode = False    #### インスタンスにモード変数(例えばbool型)を定義して初期化
            print('Common.Init')
    
        def Process_A(self):
            print('Common.ProcessA')
    
        def Process_B(self):
            print('Common.ProcessB')
            if self.rootmode:       #### インスタンスのモード変数に応じて呼び先変更
                cls_Common.Process_A(self)
            else:
                self.Process_A()
    
        def Process_C(self, root):  #### モードを指定するパラメータを定義
            print('Common.ProcessC')
            if root:                #### 指定されたパラメータに応じて呼び先変更
                cls_Common.Process_A(self)
            else:
                self.Process_A()
    
        def Process_M(self, mode):  #### インスタンスのモード変数を変更するメソッド
            self.rootmode = mode
            print('Common.ProcessM')
    
    class cls_main(cls_Common):
        def __init__(self):
            super().__init__()
            print('Main.Init')
    
        def Process_Z(self):
            print('Main.ProcessZ')
            super().Process_B()
    
        def Process_A(self):
            print('Main.ProcessA')
    
        def Process_Y(self, root):  #### パラメータを指定して呼び出すメソッド追加
            print('Main.ProcessY')
            super().Process_C(root)
    
    if __name__ == '__main__':
        CLS = cls_main()
        print('-----------0')
        CLS.Process_Z()
        print('-----------1')
        CLS.Process_M(True)  #### cls_main側に対応するメソッドを追加しても良いがここでは直接呼出し
        print('-----------2')
        CLS.Process_Z()
        print('-----------3')
        CLS.Process_Y(False)
        print('-----------4')
        CLS.Process_Y(True)
        print('-----------5')
    
[/code]


CC BY-SA 4.0
2022-03-11T04:12:15.890
86795
2022-03-11T04:12:15.890
26370
86793
answer