-1

コードで GUI 構造を表現する必要がある Python プロジェクトに取り組んでいます。次のようになります。

  • window1 (button1、button2、button3、dialog1 などを含む)
  • window2 (button4、button5、dialog2、list1 などを含む)

そのため、それぞれが異なるコンテンツを持ち、さまざまな要素の背後にあるさまざまな機能を持つ多数のウィンドウがあります。各ウィンドウには、そこでのみ機能するさまざまなカスタム メソッドを含めることができます。

今、私には2つの可能性があります:

最初:

class Window1(object):
    def __init__(self):
        self.elements = {"button1":button1,"button2":button2,...}

    def customMethod(self):
        print "do custom"

class Window2(object):
    def __init__(self):
        self.elements = {"button4":button4,"button5":button5,...}

    def otherCustomMethod(self):
        print "do other custom"

...
window1 = Window1()
window2 = Window2()

しかし、これを行うと、各ウィンドウに 1 つずつ、多くのクラスが存在することになり、各ウィンドウのインスタンスが 1 つだけ必要になります。したがって、2 番目の可能性は、その場で適切なオブジェクトを作成することです。

# create template class
class WindowGeneric(object):
    pass

# create first window
window1 = WindowGeneric()
window1.elements = {"button4":button4,"button5":button5,...}

def customMethod(self):
    print "do custom"

window1.customMethod = customMethod.__get__(window1, WindowGeneric) #bind to instance

#create second window
window2 = WindowGeneric()
window2.elements = {"button4":button4,"button5":button5,...}

def otherCustomMethod(self):
    print "do other custom"

window1.otherCustomMethod = otherCustomMethod.__get__(window2, WindowGeneric) #bind to instance

しかし、この解決策も、「ハッキング」のせいで見苦しく見えます。

オブジェクトの作成がすべてです。ウィンドウの要素は実行前に認識され、実行中に変更されることはありません。

これを行うためのより良い方法はありますか?

編集:少し明確にするために:私は多くの類似しているが同等ではないオブジェクトを作成したいだけです(それらは内部に異なるメソッドと変数を持つことができます)が、オブジェクトごとに新しいクラスを作成する方が良いかどうかわかりません(バージョン 1) またはダミー オブジェクトを作成し、後で個々の機能を追加してオブジェクトを作成する (バージョン 2)。

4

3 に答える 3

0

プレゼンテーションをロジックからできるだけ分離することは、一般的によりクリーンです。

インターフェイス要素の単なる/ほとんどのダムコンテナである汎用ウィンドウと、必要なコールバックを考えてみてください(メソッドに渡された関数または呼び出し可能なオブジェクトである可能__init__性があり、外部からオブジェクトに新しいメソッドをハックする必要はありません) )。

これの意味は:

  • ダム ウィンドウが多数ある場合は、config (XML など) からダム ウィンドウを簡単に構築できるため、ハードコードされたレイアウト情報をロジックと混在させる必要がなくなります。
  • GUI要素を表示せずにテストを実行するために、ウィンドウを簡単にモックするか、コールバックを直接呼び出すことができます
  • 必要に応じて、さまざまな GUI システムに簡単に移植できます。
于 2012-10-16T13:17:41.220 に答える
0

コード スニペットで判断するのは非常に困難ですが、おそらく継承を使用してこの問題を解決できます...

class BaseWindow(object):
     def __init__(self,elements):
        self.elements = elements
     def common_method1(self,...):
        ...
     def common_method2(self,...):
        ...

class Window1(BaseWindow):
     def __init__(self):
        BaseWindow.__init__(self,{"button1":button1,"button2":button2,...})
于 2012-10-16T13:04:07.220 に答える
0

ここで必要なのは Factory パターンです。FactoryWindow クラスを作成し、 classmethod を追加して、createwindowいくつかに基づいてウィンドウをインスタンス化しますWindow ID。インスタンス化されたすべての Windows のディクショナリを維持し、既存のものをインスタンス化する場合は、新しいインスタンスを作成する代わりに、以前のインスタンスを返します。

class FactoryWindow(object):
    Windows = {1:Window1,2:Window2}
    window_instance = {}
    @classmethod
    def CreateWindow(cls,win_no):
        if win_no in cls.window_instance:
            return cls.window_instance[win_no]
        else:
            cls.window_instance[win_no] = cls.Windows[win_no]()
            return cls.window_instance[win_no]


>>> window1 = FactoryWindow.CreateWindow(1)
>>> window2 = FactoryWindow.CreateWindow(2)
>>> window3 = FactoryWindow.CreateWindow(1)
>>> id(window3) == id(window1)
True
于 2012-10-16T13:16:31.683 に答える