3

クラスコンストラクターはサブクラスを返す必要がありますか?

これは主にOOPスタイルとPythonスタイルに関する質問です。一般的なケースソリューションを実装する必要があり、パフォーマンス上の理由から、特定の入力タイプ用に最適化されたソリューションを実装する必要があるという問題があります。入力タイプはユーザーによって異なります。現在、一般的なケースのソリューションをサブクラス化して最適化されたソリューションを作成することにより、これを実装しています。私が何を意味するかを説明するのを助けるために、私は次の例を思いついた。

from collections import Counter

class MyCounter(object):
    """General Case Counter"""
    def __init__(self, seq):
        self.seq = seq

    def count(self, key):
        return sum(key == item for item in self.seq)


class OptimizedCounter(MyCounter):
    """Counter optimized for hashable types"""
    def __init__(self, seq):
        self.counter = Counter(seq)

    def count(self, key):
        return self.counter.get(key, 0)

counter = MyCounter(['a', 'a', 'b', [], [0, 1]])
counter.count([0, 1])
# 1

counter = OptimizedCounter(['a', 'a', 'b'])
counter.count('a')
# 2

私の質問は、ユーザーが実装方法を気にすることなく適切なインスタンスを取得できるように、スムーズなインターフェイスをどのように設計するかです。私は次のようなことを考えましたが、それは私には醜い感じがします。このようなことを行うためのより標準的なまたはOOPの方法はありますか?

class MyCounter(object):
    """General Case Counter"""
    def __new__(cls, seq):
        if hasOnlyHashables(seq):
            return object.__new__(OptimizedCounter)
        else:
            return object.__new__(MyCounter)
4

3 に答える 3

10

適切なクラスのインスタンスを返すファクトリ関数を使用します。

def makeCounter(seq):
    if hasOnlyHashables(seq):
        return OptimizedCounter(seq)
    else:
        return MyCounter(seq)
于 2012-09-15T00:36:12.450 に答える
0

アロケーターの実装が少しずれています。子 (または別の) 型のインスタンスを作成する必要がある場合は、そのコンストラクターを呼び出して作成します。現在のクラスのインスタンスを作成する場合にのみ、親 (objectこの場合) のアロケーターを呼び出す必要があります。

于 2012-09-15T00:46:31.147 に答える