2

私がクラスを作成するのはよくあることですが、そのクラスに密接に関連しているヘルパー関数も一緒に作成します。私のWindow現在のところ、いくつかの呼び出しをラップするクラスとwin32api、たとえばウィンドウを見つけるための関数。それらのヘルパー関数は、指定されたモジュールのグローバルであるか、クラスのクラスメソッドである必要がありますWindow。つまり、モジュールに次のように含める必要があります。

class Window(object):
    def __init__(self, handle): 
        self.handle = handle
        ...
    ...
    @classmethod
    def find_windows(cls, params):
        handles = ...
        return map(cls, handles)

使用法は次のとおりです。

from window import Window
windows = Window.find_windows("Specialty")

または私がすべきこと:

class Window(object):
    def __init__(self, handle): 
        self.handle = handle
        ...
    ...

def find_windows(params):
    handles = ...
    return map(Window, handles)

使用法は次のとおりです。

from window import Window, find_windows
windows = find_windows("Speciality")

もっと簡潔に言えば、グループ化はクラスレベル(たとえば、Javaの静的メソッド)にする必要がありますか、それともモジュールレベルにする必要がありますか?

4

3 に答える 3

2

最初のアプローチには、サブクラス化した場合にメソッドWindowをオーバーライドできるという利点がありますfind_windows(Javaの静的メソッドとは異なります)。ただし、これはオーバーライドが最終的に意味をなす場合にのみ役立ちます。そうでない場合は、関数として使用する方が見栄えがよいと思います。

編集:Windowオブジェクトを検索する方法が複数ある場合は、クエリ/検索ロジックをカプセル化するWindowFinderまたはWindowManagerと呼ばれる追加のクラスを用意するのが理にかなっています。

これはdjangoで使用されるパターンであり、Windowクラスがdbモデルである場合、Window.objectsがWindowManagerを指していることになります。ウィンドウマネージャーには、SQLクエリを作成するためのメソッドがあります。

次に、次のようなことができます。

Window.objects.all()

また

Window.objects.filter(name="Speciality")
于 2012-09-03T22:01:10.957 に答える
2

find_windows()クラスの内部動作へのアクセスや知識が必要ない場合はWindow、それをグローバル関数にします。別々のコード間の依存関係を増やすことによって得られるものはほとんどありません。特に、基本的にソースがどこにあるかという問題だけの場合はそうです。

于 2012-09-03T23:10:26.153 に答える
0

私が正しく理解していれば、あなたのfind_windows関数はWindowハンドルのリストからインスタンスのリストを作成します。

コンストラクターとして動作するため、classmethodクラスではWindowなく関数にします。コメントで述べたように、その方が自然に感じますが、それは単なる予感です。

編集

@Ioan Alexandru Cucuの答えは、あなたがあなたWindowを、例えば、としてサブクラス化する場合を考えさせられましたSubWindowfind_windows(または提案されているようにcreate_windows)がである場合、インスタンスclassmethodのリストを返しますが、私が提案したように、それが独立した関数である場合にSubWindowのみインスタンスを返します。Window

これは興味深い機能と見なすことができ、その場合はfind_windowsとして保持するのが理にかなっていclassmethodます。私はまだdocstringまたは他の場所で理論的根拠を説明するある種のコメントを置きます。

<tl;dr>それは異なります。

于 2012-09-03T21:52:14.320 に答える