2017-10-29 4 views
1

にパラメータを渡された私は、Pythonの学習に初心者だ.. 私は助けを探していOOPの問題を解決する上では、Python

私のメインプログラムがあり以下のように簡略化何か:

class Mybutton(): 
    def _init_(self, parent, command): 
      self.command = command 

    def A_ramdom_fcn(self): 
      ... 
      self.command() ------------------>> here I want to execute the command 
                     in class abc, not in class Mybutton. 

どのように実行する:メインプログラムで

class abc(Frame): 
    def _init_(self, master) 
      Frame.__init__(self)  
      self.B1 = Mybutton(self.master, self.cmd) 
    def cmd(self): 
      print("hello world") 

、私は以下のように簡略化され、別のファイルにmyButtonというクラスをインポートしますメソッドを別のクラスのインスタンスメソッドとして渡された場合、クラスabcでそれを実行するだけではなく、ボタンが押されたイベントを持っているのかどうか聞かれるかもしれません。

+0

それは正しい.. –

答えて

0

まず、 2つのクラスの両方に__init__(2つのアンダースコアを含む)である必要があります。のinitメソッドには、:がありません。


あなたは自分自身を変えたようです。あなたは構成を使って正しく設定しています:abcにはMybuttonがあります。それを実行するには、正しく関数をMybuttonに渡したようです。あなたは、あなたが物事を設定した方法を用いて、実施例

a = abc(master) # no context for what master is, but I assume you have it 
a.B1.A_ramdom_fcn() 

のために、あなたはあなたのメインプログラムでMybuttonのインスタンスをインポートしたくないならば実際には、あなたのコードが書かれたように動作します(何abcに属しますか?)。インポートしてインスタンスをabcにしたいとします。上記の例で示したように、内部のMybuttonにアクセスします。これは、abcコンストラクタの内部でMybuttonコンストラクタにself.cmdを渡すと、構築中のabcのバインドされたメソッドです。補遺として


あなたは、このようなラウンドアバウト方式を必要とする理由に関してXY problemを持つかもしれないように、それが見えます。 abc.cmdをボタンプレスハンドラに渡すことができない理由はありますか?

+0

こんにちはジョシュ。返信いただきありがとうございます。それは確かにxyの問題です...私は別のクラスから自分のクラスメソッドにアクセスする方法を尋ねることになりました。この場合、cmd()にアクセスし、MyButtonクラスから "hello world"を印刷します。 私はTkにカスタマイズされたボタンウィジェットを作成します。私はちょうどB1 = Mybutton(root、x、y、mycommand)と言うことができ、クラスabcのコマンドを呼び出すことができますが、Mybuttonに渡されて以来、私はコールバックする必要があります... –

0

理論的には、何をしようとしていることは可能である、あなたは変数にオブジェクトのメソッドをキャプチャすることができますし、(のpython 3)後でそれを呼び出す:

class Window: 

    def __init__(self): 
     self.my_button = Mybutton(self.cmd) 

    def cmd(self): 
     print("hello world") 


class Mybutton: 

    def __init__(self, command): 
     self.command = command 

    def a_ramdom_fcn(self): 
     self.command.__call__() 


win = Window() 
win.my_button.a_ramdom_fcn() 

私はあなたがdoesnのジェネリックButtonクラスを作成しようとしていると仮定クリックして実際のロジックをWindowクラスに入れたいときに何をすべきか分かりません。

それは理にかなっていますが、論理を第3のクラスCommandクラスに抽出する方がよいでしょう。これはWindow責任を制限し、またしてトリックを避けるために、私たちにできる方法-として変数(私たちはボタンオブジェクトに渡すcommandはちょうどもう一つの目的である):メインプログラムでは、ここにタイプミスをした

class HelloWorldCommand: 

    def execute(self): 
     print("Hello world") 


class Window: 

    def __init__(self): 
     self.my_button = Mybutton(
      HelloWorldCommand() 
     ) 

class Mybutton: 

    def __init__(self, command): 
     self.command = command 

    def a_ramdom_fcn(self): 
     self.command.execute() 


win = Window() 
win.my_button.a_ramdom_fcn()