1

PySide を使用して、Python と Qt でデスクトップ アプリをコーディングしています。トップレベルのアイテムがその子とは異なるタイプのオブジェクトであるツリー ビューを表示する必要があります。具体的には、最上位アイテムは Git リポジトリであり、その子は作業ツリー内のディレクトリです。

リポジトリの場合、そのパスと現在チェックアウトされているブランチを表示したいと考えています。ディレクトリの場合、その名前を表示したいだけです。

現時点では、下位のモデル オブジェクト (メソッドから取得) をQAbstractItemModel子孫に使用させ、結果の文字列をフォーマットする方法を決定することでこれを行います。isinstanceinternalPointer()

この種の二重ディスパッチを行うための、より Pythonic な (またはより不格好な) 方法があるかどうか疑問に思っていました。

私がやりたくないのは、Git リポジトリと作業ツリー ファイルのモデル クラスでこの目的のためのメソッドを定義することです。これは SRP に違反すると思うからです。

どんな考えやアイデアでも大歓迎です。また、誰かがこの質問のより不格好なタイトルを考えられる場合は、私に知らせてください ;)

4

1 に答える 1

0

View コードを含む関数を持つ各 Model クラスに問題がなければ、それらの関数を呼び出すことができます。を使用せずにモデル/ビュー コードを分離するにisinstanceは、このSO answerで説明されているように、 ast モジュールで使用されているように、ビジター パターンの場合のように聞こえます。

基本的に、各 Model クラスにはaccept()Visitor オブジェクトを受け取るメソッドがあります。accept()リポジトリのメソッドは、その Visitor オブジェクトのメソッドを呼び出して( visit_repository()Modelselfインスタンス) を渡します。同様に、accept()ディレクトリのvisit_directory()メソッドは、その Visitor オブジェクトのメソッドを呼び出し、 を渡しselfます。visit_repository()orメソッドはvisit_directory()Model インスタンスにアクセスし、その型を認識して適切なビューを表示できます。これにより、View コード (Visitor オブジェクト内) が Model コード (Model クラス内) から分離されます。

*注: 異なる関数名 ( visit_repository()vs visit_directory()) を使用する代わりに、マルチメソッドを使用できます。たとえば、このSO answer about multimethods in Python などです。

于 2013-07-07T02:11:05.390 に答える